Merge commit 'v4.4.1.20091022' into gtk
authorArun Persaud <arun@nubati.net>
Wed, 4 Nov 2009 02:42:34 +0000 (18:42 -0800)
committerArun Persaud <arun@nubati.net>
Wed, 4 Nov 2009 02:42:34 +0000 (18:42 -0800)
Conflicts:
backend.c
configure.ac
xboard.c

33 files changed:
Makefile.am
backend.c
callback.c [new file with mode: 0644]
callback.h [new file with mode: 0644]
configure.ac
frontend.h
gtk-interface.xml [new file with mode: 0644]
interface.c [new file with mode: 0644]
interface.h [new file with mode: 0644]
svg/BlackBishop.svg [new file with mode: 0644]
svg/BlackKing.svg [new file with mode: 0644]
svg/BlackKnight.svg [new file with mode: 0644]
svg/BlackPawn.svg [new file with mode: 0644]
svg/BlackQueen.svg [new file with mode: 0644]
svg/BlackRook.svg [new file with mode: 0644]
svg/DarkSquare.svg [new file with mode: 0644]
svg/LightSquare.svg [new file with mode: 0644]
svg/NeutralSquare.svg [new file with mode: 0644]
svg/WhiteBishop.svg [new file with mode: 0644]
svg/WhiteKing.svg [new file with mode: 0644]
svg/WhiteKnight.svg [new file with mode: 0644]
svg/WhitePawn.svg [new file with mode: 0644]
svg/WhiteQueen.svg [new file with mode: 0644]
svg/WhiteRook.svg [new file with mode: 0644]
svg/icon_black.svg [new file with mode: 0644]
svg/icon_white.svg [new file with mode: 0644]
svg/pieces.svg [new file with mode: 0644]
xboard.c
xedittags.c
xedittags.h
xengineoutput.c
xhistory.c
xhistory.h

index 6332932..bb1a656 100644 (file)
@@ -6,13 +6,16 @@ else
 endif
 
 bin_PROGRAMS = xboard
+
 xboard_SOURCES = backend.c backend.h backendz.h \
                 book.c \
+                callback.c callback.h \
                 childio.c childio.h \
                 common.h \
                 frontend.h \
                 gamelist.c \
                 gettext.h  \
+                interface.c interface.h \
                 lists.c lists.h \
                 moves.c moves.h \
                 parser.l parser.h \
@@ -25,7 +28,7 @@ xboard_SOURCES = backend.c backend.h backendz.h \
                 xhistory.c  xhistory.h \
                 xoptions.c \
                 $(ZPY)
-xboard_LDADD = -lm @X_PRE_LIBS@ @XAW_LIBS@ @X_LIBS@ @X_EXTRA_LIBS@
+xboard_LDADD = -lm  @XAW_LIBS@ @GTK_LIBS@
 
 EXTRA_DIST = pixmaps  bitmaps shogibitmaps \
        xboard.texi gpl.texinfo texi2man texinfo.tex xboard.man \
@@ -33,7 +36,7 @@ EXTRA_DIST = pixmaps  bitmaps shogibitmaps \
 
 DISTCLEANFILES = stamp-h
 
-AM_CPPFLAGS=-DINFODIR='"$(infodir)"' @X_CFLAGS@
+AM_CPPFLAGS=-DINFODIR='"$(infodir)"' @GTK_CFLAGS@
 
 info_TEXINFOS =  xboard.texi
 xboard_TEXINFOS =  copyright.texi 
index 7cd8dd7..febfae0 100755 (executable)
--- a/backend.c
+++ b/backend.c
@@ -126,15 +126,15 @@ extern int gettimeofday(struct timeval *, struct timezone *);
 # include "zippy.h"
 #endif
 #include "backendz.h"
-#include "gettext.h" 
-#ifdef ENABLE_NLS 
-# define _(s) gettext (s) 
-# define N_(s) gettext_noop (s) 
-#else 
-# define _(s) (s) 
-# define N_(s) s 
-#endif 
+#include "gettext.h"
+
+#ifdef ENABLE_NLS
+# define _(s) gettext (s)
+# define N_(s) gettext_noop (s)
+#else
+# define _(s) (s)
+# define N_(s) s
+#endif
 
 
 /* A point in time */
@@ -347,7 +347,7 @@ PosFlags(index)
   case VariantKriegspiel:
     flags |= F_KRIEGSPIEL_CAPTURE;
     break;
-  case VariantCapaRandom: 
+  case VariantCapaRandom:
   case VariantFischeRandom:
     flags |= F_FRC_TYPE_CASTLING; /* [HGM] enable this through flag */
   case VariantNoCastle:
@@ -363,7 +363,7 @@ PosFlags(index)
 
 FILE *gameFileFP, *debugFP;
 
-/* 
+/*
     [AS] Note: sometimes, the sscanf() function is used to parse the input
     into a fixed-size buffer. Because of this, we must be prepared to
     receive strings as long as the size of the input buffer, which is currently
@@ -449,7 +449,7 @@ int   nrCastlingRights; // For TwoKings, or to implement castling-unknown status
 int   initialRulePlies, FENrulePlies;
 char  FENepStatus;
 FILE  *serverMoves = NULL; // next two for broadcasting (/serverMoves option)
-int loadFlag = 0; 
+int loadFlag = 0;
 int shuffleOpenings;
 int mute; // mute all sounds
 
@@ -505,31 +505,31 @@ ChessSquare XiangqiArray[2][BOARD_SIZE] = {
 };
 
 ChessSquare CapablancaArray[2][BOARD_SIZE] = {
-    { WhiteRook, WhiteKnight, WhiteAngel, WhiteBishop, WhiteQueen, 
+    { WhiteRook, WhiteKnight, WhiteAngel, WhiteBishop, WhiteQueen,
         WhiteKing, WhiteBishop, WhiteMarshall, WhiteKnight, WhiteRook },
-    { BlackRook, BlackKnight, BlackAngel, BlackBishop, BlackQueen, 
+    { BlackRook, BlackKnight, BlackAngel, BlackBishop, BlackQueen,
         BlackKing, BlackBishop, BlackMarshall, BlackKnight, BlackRook }
 };
 
 ChessSquare GreatArray[2][BOARD_SIZE] = {
-    { WhiteDragon, WhiteKnight, WhiteAlfil, WhiteGrasshopper, WhiteKing, 
+    { WhiteDragon, WhiteKnight, WhiteAlfil, WhiteGrasshopper, WhiteKing,
         WhiteSilver, WhiteCardinal, WhiteAlfil, WhiteKnight, WhiteDragon },
-    { BlackDragon, BlackKnight, BlackAlfil, BlackGrasshopper, BlackKing, 
+    { BlackDragon, BlackKnight, BlackAlfil, BlackGrasshopper, BlackKing,
         BlackSilver, BlackCardinal, BlackAlfil, BlackKnight, BlackDragon },
 };
 
 ChessSquare JanusArray[2][BOARD_SIZE] = {
-    { WhiteRook, WhiteAngel, WhiteKnight, WhiteBishop, WhiteKing, 
+    { WhiteRook, WhiteAngel, WhiteKnight, WhiteBishop, WhiteKing,
         WhiteQueen, WhiteBishop, WhiteKnight, WhiteAngel, WhiteRook },
-    { BlackRook, BlackAngel, BlackKnight, BlackBishop, BlackKing, 
+    { BlackRook, BlackAngel, BlackKnight, BlackBishop, BlackKing,
         BlackQueen, BlackBishop, BlackKnight, BlackAngel, BlackRook }
 };
 
 #ifdef GOTHIC
 ChessSquare GothicArray[2][BOARD_SIZE] = {
-    { WhiteRook, WhiteKnight, WhiteBishop, WhiteQueen, WhiteMarshall, 
+    { WhiteRook, WhiteKnight, WhiteBishop, WhiteQueen, WhiteMarshall,
         WhiteKing, WhiteAngel, WhiteBishop, WhiteKnight, WhiteRook },
-    { BlackRook, BlackKnight, BlackBishop, BlackQueen, BlackMarshall, 
+    { BlackRook, BlackKnight, BlackBishop, BlackQueen, BlackMarshall,
         BlackKing, BlackAngel, BlackBishop, BlackKnight, BlackRook }
 };
 #else // !GOTHIC
@@ -538,9 +538,9 @@ ChessSquare GothicArray[2][BOARD_SIZE] = {
 
 #ifdef FALCON
 ChessSquare FalconArray[2][BOARD_SIZE] = {
-    { WhiteRook, WhiteKnight, WhiteBishop, WhiteLance, WhiteQueen, 
+    { WhiteRook, WhiteKnight, WhiteBishop, WhiteLance, WhiteQueen,
         WhiteKing, WhiteLance, WhiteBishop, WhiteKnight, WhiteRook },
-    { BlackRook, BlackKnight, BlackBishop, BlackLance, BlackQueen, 
+    { BlackRook, BlackKnight, BlackBishop, BlackLance, BlackQueen,
         BlackKing, BlackLance, BlackBishop, BlackKnight, BlackRook }
 };
 #else // !FALCON
@@ -625,7 +625,7 @@ InitBackEnd1()
     if (appData.icsActive) {
        appData.matchMode = FALSE;
        appData.matchGames = 0;
-#if ZIPPY      
+#if ZIPPY
        appData.noChessProgram = !appData.zippyPlay;
 #else
        appData.zippyPlay = FALSE;
@@ -679,7 +679,7 @@ InitBackEnd1()
 
     /* [AS] Adjudication threshold */
     adjudicateLossThreshold = appData.adjudicateLossThreshold;
-    
+
     first.which = "first";
     second.which = "second";
     first.maybeThinking = second.maybeThinking = FALSE;
@@ -798,7 +798,7 @@ InitBackEnd1()
        appData.clockMode = FALSE;
        first.sendTime = second.sendTime = 0;
     }
-    
+
 #if ZIPPY
     /* Override some settings from environment variables, for backward
        compatibility.  Unfortunately it's not feasible to have the env
@@ -808,7 +808,7 @@ InitBackEnd1()
       ZippyInit();
     }
 #endif
-    
+
     if (appData.noChessProgram) {
        programVersion = (char*) malloc(5 + strlen(PACKAGE_STRING));
        sprintf(programVersion, "%s", PACKAGE_STRING);
@@ -943,7 +943,7 @@ int NextSessionFromString( char ** str, int *moves, long * tc, long *inc)
             if(result = NextIntegerFromString( str, &temp2)) return -1;
             *inc = temp2 * 1000;
         } else *inc = 0;
-        *moves = 0; *tc = temp * 1000; 
+        *moves = 0; *tc = temp * 1000;
         return 0;
     } else if(temp % 60 != 0) return -1;     /* moves was given as min:sec */
 
@@ -1038,31 +1038,31 @@ ParseTimeControl(tc, ti, mps)
 void
 InitBackEnd2()
 {
-    if (appData.debugMode) {
-       fprintf(debugFP, "%s\n", programVersion);
-    }
+  if (appData.debugMode) {
+    fprintf(debugFP, "%s\n", programVersion);
+  }
 
-    set_cont_sequence(appData.wrapContSeq);
-    if (appData.matchGames > 0) {
-       appData.matchMode = TRUE;
-    } else if (appData.matchMode) {
-       appData.matchGames = 1;
-    }
-    if(appData.matchMode && appData.sameColorGames > 0) /* [HGM] alternate: overrule matchGames */
-       appData.matchGames = appData.sameColorGames;
-    if(appData.rewindIndex > 1) { /* [HGM] autoinc: rewind implies auto-increment and overrules given index */
-       if(appData.loadPositionIndex >= 0) appData.loadPositionIndex = -1;
-       if(appData.loadGameIndex >= 0) appData.loadGameIndex = -1;
-    }
-    Reset(TRUE, FALSE);
-    if (appData.noChessProgram || first.protocolVersion == 1) {
-      InitBackEnd3();
+  set_cont_sequence(appData.wrapContSeq);
+  if (appData.matchGames > 0) {
+    appData.matchMode = TRUE;
+  } else if (appData.matchMode) {
+    appData.matchGames = 1;
+  }
+  if(appData.matchMode && appData.sameColorGames > 0) /* [HGM] alternate: overrule matchGames */
+    appData.matchGames = appData.sameColorGames;
+  if(appData.rewindIndex > 1) { /* [HGM] autoinc: rewind implies auto-increment and overrules given index */
+    if(appData.loadPositionIndex >= 0) appData.loadPositionIndex = -1;
+    if(appData.loadGameIndex >= 0) appData.loadGameIndex = -1;
+  }
+  Reset(TRUE, FALSE);
+  if (appData.noChessProgram || first.protocolVersion == 1) {
+    InitBackEnd3();
     } else {
-      /* kludge: allow timeout for initial "feature" commands */
-      FreezeUI();
-      DisplayMessage("", _("Starting chess program"));
-      ScheduleDelayedEvent(InitBackEnd3, FEATURE_TIMEOUT);
-    }
+    /* kludge: allow timeout for initial "feature" commands */
+    FreezeUI();
+    DisplayMessage("", _("Starting chess program"));
+    ScheduleDelayedEvent(InitBackEnd3, FEATURE_TIMEOUT);
+  }
 }
 
 void
@@ -1078,15 +1078,15 @@ InitBackEnd3 P((void))
     if (appData.icsActive) {
 #ifdef WIN32
         /* [DM] Make a console window if needed [HGM] merged ifs */
-        ConsoleCreate(); 
+        ConsoleCreate();
 #endif
        err = establish();
        if (err != 0) {
            if (*appData.icsCommPort != NULLCHAR) {
-               sprintf(buf, _("Could not open comm port %s"),  
+               sprintf(buf, _("Could not open comm port %s"),
                        appData.icsCommPort);
            } else {
-               snprintf(buf, sizeof(buf), _("Could not connect to host %s, port %s"),  
+               snprintf(buf, sizeof(buf), _("Could not connect to host %s, port %s"),
                        appData.icsHost, appData.icsPort);
            }
            DisplayFatalError(buf, err, 1);
@@ -1109,7 +1109,7 @@ InitBackEnd3 P((void))
        cmailISR =
          AddInputSource(cmailPR, FALSE, CmailSigHandlerCallBack, &cmailISR);
     }
-    
+
     ThawUI();
     DisplayMessage("", "");
     if (StrCaseCmp(appData.initialMode, "") == 0) {
@@ -1117,7 +1117,7 @@ InitBackEnd3 P((void))
     } else if (StrCaseCmp(appData.initialMode, "TwoMachines") == 0) {
       initialMode = TwoMachinesPlay;
     } else if (StrCaseCmp(appData.initialMode, "AnalyzeFile") == 0) {
-      initialMode = AnalyzeFile; 
+      initialMode = AnalyzeFile;
     } else if (StrCaseCmp(appData.initialMode, "Analysis") == 0) {
       initialMode = AnalyzeMode;
     } else if (StrCaseCmp(appData.initialMode, "MachineWhite") == 0) {
@@ -1293,7 +1293,7 @@ establish()
                        appData.icsHost, appData.icsPort);
            } else {
                snprintf(buf, sizeof(buf), "%s %s -l %s %s %s %s",
-                       appData.remoteShell, appData.gateway, 
+                       appData.remoteShell, appData.gateway,
                        appData.remoteUser, appData.telnetProgram,
                        appData.icsHost, appData.icsPort);
            }
@@ -1476,7 +1476,7 @@ SendToICSDelayed(s,msdelay)
 
 
 /* Remove all highlighting escape sequences in s
-   Also deletes any suffix starting with '(' 
+   Also deletes any suffix starting with '('
    */
 char *
 StripHighlightAndTitle(s)
@@ -1566,7 +1566,7 @@ StringToVariant(e)
 
     if (!found) {
       if ((StrCaseStr(e, "fischer") && StrCaseStr(e, "random"))
-         || StrCaseStr(e, "wild/fr") 
+         || StrCaseStr(e, "wild/fr")
          || StrCaseStr(e, "frc") || StrCaseStr(e, "960")) {
         v = VariantFischeRandom;
       } else if ((i = 4, p = StrCaseStr(e, "wild")) ||
@@ -1644,7 +1644,7 @@ StringToVariant(e)
          v = VariantShatranj;
          break;
 
-       /* Temporary names for future ICC types.  The name *will* change in 
+       /* Temporary names for future ICC types.  The name *will* change in
           the next xboard/WinBoard release after ICC defines it. */
        case 29:
          v = Variant29;
@@ -1751,7 +1751,7 @@ looking_at(buf, index, pattern)
     char *bufp = &buf[*index], *patternp = pattern;
     int star_count = 0;
     char *matchp = star_match[0];
-    
+
     for (;;) {
        if (*patternp == NULLCHAR) {
            *index = leftover_start = bufp - buf;
@@ -1956,7 +1956,6 @@ VariantSwitch(Board board, VariantClass newVariant)
     * but also when receiving holdings of a crazyhouse game. In the latter
     * case we want to add those holdings to the already received position.
     */
-
    
    if (appData.debugMode) {
      fprintf(debugFP, "Switch board from %s to %s\n",
@@ -2049,7 +2048,7 @@ read_from_ics(isr, closure, data, count, error)
 #define STARTED_CHATTER 5
 #define STARTED_COMMENT 6
 #define STARTED_MOVES_NOHIDE 7
-    
+
     static int started = STARTED_NONE;
     static char parse[20000];
     static int parse_pos = 0;
@@ -2153,7 +2152,7 @@ read_from_ics(isr, closure, data, count, error)
        buf[buf_len] = NULLCHAR;
        next_out = leftover_len;
        leftover_start = 0;
-       
+
        i = 0;
        while (i < buf_len) {
            /* Deal with part of the TELNET option negotiation
@@ -2265,12 +2264,12 @@ read_from_ics(isr, closure, data, count, error)
                  next_out = i;
                continue;
            }
-               
+
            /* OK, this at least will *usually* work */
            if (!loggedOn && looking_at(buf, &i, "ics%")) {
                loggedOn = TRUE;
            }
-           
+
            if (loggedOn && !intfSet) {
                if (ics_type == ICS_ICC) {
                  sprintf(str,
@@ -2412,11 +2411,11 @@ read_from_ics(isr, closure, data, count, error)
 
            oldi = i;
            // [HGM] kibitz: try to recognize opponent engine-score kibitzes, to divert them to engine-output window
-           if (appData.autoKibitz && started == STARTED_NONE && 
+           if (appData.autoKibitz && started == STARTED_NONE &&
                 !appData.icsEngineAnalyze &&                     // [HGM] [DM] ICS analyze
                (gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack || gameMode == IcsObserving)) {
                if(looking_at(buf, &i, "* kibitzes: ") &&
-                  (StrStr(star_match[0], gameInfo.white) == star_match[0] || 
+                  (StrStr(star_match[0], gameInfo.white) == star_match[0] ||
                    StrStr(star_match[0], gameInfo.black) == star_match[0]   )) { // kibitz of self or opponent
                        suppressKibitz = TRUE;
                        if((StrStr(star_match[0], gameInfo.white) == star_match[0]
@@ -2430,7 +2429,7 @@ read_from_ics(isr, closure, data, count, error)
                            savingComment = TRUE;
                            suppressKibitz = gameMode != IcsObserving ? 2 :
                                (StrStr(star_match[0], gameInfo.white) == NULL) + 1;
-                       } 
+                       }
                        continue;
                } else
                if(looking_at(buf, &i, "kibitzed to")) { // suppress the acknowledgements of our own autoKibitz
@@ -2686,14 +2685,14 @@ read_from_ics(isr, closure, data, count, error)
                SendToICS("refresh\n");
                continue;
            }
-           
+
            if (!have_sent_ICS_logon && looking_at(buf, &i, "login:")) {
                ICSInitScript();
                have_sent_ICS_logon = 1;
                continue;
            }
-             
-           if (ics_getting_history != H_GETTING_MOVES /*smpos kludge*/ && 
+
+           if (ics_getting_history != H_GETTING_MOVES /*smpos kludge*/ &&
                (looking_at(buf, &i, "\n<12> ") ||
                 looking_at(buf, &i, "<12> "))) {
                loggedOn = TRUE;
@@ -2776,7 +2775,7 @@ read_from_ics(isr, closure, data, count, error)
                    gameInfo.whiteRating = string_to_rating(star_match[1]);
                    gameInfo.blackRating = string_to_rating(star_match[3]);
                    if (appData.debugMode)
-                     fprintf(debugFP, _("Ratings from header: W %d, B %d\n"), 
+                     fprintf(debugFP, _("Ratings from header: W %d, B %d\n"),
                              gameInfo.whiteRating, gameInfo.blackRating);
                }
                continue;
@@ -2830,8 +2829,8 @@ read_from_ics(isr, closure, data, count, error)
                    break;
                }
                continue;
-           }                           
-           
+           }
+
            if (looking_at(buf, &i, "% ") ||
                ((started == STARTED_MOVES || started == STARTED_MOVES_NOHIDE)
                 && looking_at(buf, &i, "}*"))) { char *bookHit = NULL; // [HGM] book
@@ -2849,7 +2848,7 @@ read_from_ics(isr, closure, data, count, error)
                            if (WhiteOnMove(forwardMostMove)) {
                                if (first.sendTime) {
                                  if (first.useColors) {
-                                   SendToProgram("black\n", &first); 
+                                   SendToProgram("black\n", &first);
                                  }
                                  SendTimeRemaining(&first, TRUE);
                                }
@@ -2893,7 +2892,7 @@ read_from_ics(isr, closure, data, count, error)
                                  firstMove = TRUE;
                                }
                            }
-                       }                       
+                       }
                    }
 #endif
                    if (gameMode == IcsObserving && ics_gamenum == -1) {
@@ -2936,7 +2935,7 @@ read_from_ics(isr, closure, data, count, error)
                if(bookHit) { // [HGM] book: simulate book reply
                    static char bookMove[MSG_SIZ]; // a bit generous?
 
-                   programStats.nodes = programStats.depth = programStats.time = 
+                   programStats.nodes = programStats.depth = programStats.time =
                    programStats.score = programStats.got_only_move = 0;
                    sprintf(programStats.movelist, "%s (xbook)", bookHit);
 
@@ -2946,14 +2945,14 @@ read_from_ics(isr, closure, data, count, error)
                }
                continue;
            }
-           
+
            if ((started == STARTED_MOVES || started == STARTED_BOARD ||
                 started == STARTED_HOLDINGS ||
                 started == STARTED_MOVES_NOHIDE) && i >= leftover_len) {
                /* Accumulate characters in move list or board */
                parse[parse_pos++] = buf[i];
            }
-           
+
            /* Start of game messages.  Mostly we detect start of game
               when the first board image arrives.  On some versions
               of the ICS, though, we need to do a "refresh" after starting
@@ -2986,7 +2985,7 @@ read_from_ics(isr, closure, data, count, error)
                player2Rating = string_to_rating(star_match[3]);
 
                if (appData.debugMode)
-                 fprintf(debugFP, 
+                 fprintf(debugFP,
                          "Ratings from 'Game notification:' %s %d, %s %d\n",
                          player1Name, player1Rating,
                          player2Name, player2Rating);
@@ -3016,8 +3015,8 @@ read_from_ics(isr, closure, data, count, error)
                    SendToICS("refresh\n");
                }
                continue;
-           }    
-           
+           }
+
            /* Error messages */
 //         if (ics_user_moved) {
            if (1) { // [HGM] old way ignored error after move type in; ics_user_moved is not set then!
@@ -3080,7 +3079,7 @@ read_from_ics(isr, closure, data, count, error)
                   2    empty, white, or black (IGNORED)
                   3    player 2 name (not necessarily black)
                   4    player 2 rating
-                  
+
                   The names/ratings are sorted out when the game
                   actually starts (below).
                */
@@ -3090,14 +3089,14 @@ read_from_ics(isr, closure, data, count, error)
                player2Rating = string_to_rating(star_match[4]);
 
                if (appData.debugMode)
-                 fprintf(debugFP, 
+                 fprintf(debugFP,
                          "Ratings from 'Creating:' %s %d, %s %d\n",
                          player1Name, player1Rating,
                          player2Name, player2Rating);
 
                continue;
            }
-           
+
            /* Improved generic start/end-of-game messages */
            if ((tkind=0, looking_at(buf, &i, "{Game * (* vs. *) *}*")) ||
                (tkind=1, looking_at(buf, &i, "{Game * (*(*) vs. *(*)) *}*"))){
@@ -3250,8 +3249,8 @@ read_from_ics(isr, closure, data, count, error)
                        ClearPremoveHighlights();
                        if (appData.debugMode)
                          fprintf(debugFP, "Sending premove:\n");
-                          UserMoveEvent(premoveFromX, premoveFromY, 
-                                       premoveToX, premoveToY, 
+                          UserMoveEvent(premoveFromX, premoveFromY,
+                                       premoveToX, premoveToY,
                                         premovePromoChar);
                      }
                    }
@@ -3336,18 +3335,18 @@ read_from_ics(isr, closure, data, count, error)
 
            i++;                /* skip unparsed character and loop back */
        }
-       
+
        if (started != STARTED_MOVES && started != STARTED_BOARD && !suppressKibitz && // [HGM] kibitz suppress printing in ICS interaction window
            started != STARTED_HOLDINGS && i > next_out) {
            SendToPlayer(&buf[next_out], i - next_out);
            next_out = i;
        }
        suppressKibitz = FALSE; // [HGM] kibitz: has done its duty in if-statement above
-       
+
        leftover_len = buf_len - leftover_start;
        /* if buffer ends with something we couldn't parse,
           reparse it after appending the next read */
-       
+
     } else if (count == 0) {
        RemoveInputSource(isr);
         DisplayFatalError(_("Connection closed by ICS"), 0, 0);
@@ -3358,13 +3357,13 @@ read_from_ics(isr, closure, data, count, error)
 
 
 /* Board style 12 looks like this:
-   
+
    <12> r-b---k- pp----pp ---bP--- ---p---- q------- ------P- P--Q--BP -----R-K W -1 0 0 0 0 0 0 paf MaxII 0 2 12 21 25 234 174 24 Q/d7-a4 (0:06) Qxa4 0 0
-   
+
  * The "<12> " is stripped before it gets to this routine.  The two
  * trailing 0's (flip state and clock ticking) are later addition, and
  * some chess servers may not have them, or may have only the first.
- * Additional trailing fields may be added in the future.  
+ * Additional trailing fields may be added in the future.
  */
 
 #define PATTERN "%c%d%d%d%d%d%d%d%s%s%d%d%d%d%d%d%d%d%s%s%s%d%d"
@@ -3380,7 +3379,7 @@ read_from_ics(isr, closure, data, count, error)
 void
 ParseBoard12(string)
      char *string;
-{ 
+{
     GameMode newGameMode;
     int gamenum, newGame, newMove, relation, basetime, increment, ics_flip = 0, i;
     int j, k, n, moveNum, white_stren, black_stren, white_time, black_time, takeback;
@@ -3399,7 +3398,7 @@ ParseBoard12(string)
     Boolean weird = FALSE;
 
     fromX = fromY = toX = toY = -1;
-    
+
     newGame = FALSE;
 
     if (appData.debugMode)
@@ -3461,7 +3460,7 @@ ParseBoard12(string)
                        0, 1);
       return;
     }
-    
+
     switch (relation) {
       case RELATION_OBSERVING_PLAYED:
       case RELATION_OBSERVING_STATIC:
@@ -3483,14 +3482,14 @@ ParseBoard12(string)
       case RELATION_ISOLATED_BOARD:
       default:
        /* Just display this board.  If user was doing something else,
-          we will forget about it until the next board comes. */ 
+          we will forget about it until the next board comes. */
        newGameMode = IcsIdle;
        break;
       case RELATION_STARTING_POSITION:
        newGameMode = gameMode;
        break;
     }
-    
+
     /* Modify behavior for initial board display on move listing
        of wild games.
        */
@@ -3523,12 +3522,12 @@ ParseBoard12(string)
        ics_getting_history = H_FALSE;
        return;
     }
-    
+
     /* Take action if this is the first board of a new game, or of a
        different game than is currently being displayed.  */
     if (gamenum != ics_gamenum || newGameMode != gameMode ||
        relation == RELATION_ISOLATED_BOARD) {
-       
+
        /* Forget the old game and get the history (if any) of the new one */
        if (gameMode != BeginningOfGame) {
          Reset(TRUE, TRUE);
@@ -3545,14 +3544,14 @@ ParseBoard12(string)
            sprintf(str, "%smoves %d\n", ics_prefix, gamenum);
            SendToICS(str);
        }
-       
+
        /* Initially flip the board to have black on the bottom if playing
           black or if the ICS flip flag is set, but let the user change
           it with the Flip View button. */
-       flipView = appData.autoFlipView ? 
+       flipView = appData.autoFlipView ?
          (newGameMode == IcsPlayingBlack) || ics_flip :
          appData.flipView;
-       
+
        /* Done with values from previous mode; copy in new ones */
        gameMode = newGameMode;
        ModeHighlight();
@@ -3583,7 +3582,7 @@ ParseBoard12(string)
   }
 
         gameInfo.outOfBook = NULL;
-       
+
        /* Do we have the ratings? */
        if (strcmp(player1Name, white) == 0 &&
            strcmp(player2Name, black) == 0) {
@@ -3609,7 +3608,7 @@ ParseBoard12(string)
            SendToICS("set shout 0\n");
        }
     }
-    
+
     /* Deal with midgame name changes */
     if (!newGame) {
        if (!gameInfo.white || strcmp(gameInfo.white, white) != 0) {
@@ -3621,7 +3620,7 @@ ParseBoard12(string)
            gameInfo.black = StrSave(black);
        }
     }
-    
+
     /* Throw away game result if anything actually changes in examine mode */
     if (gameMode == IcsExamining && !newGame) {
        gameInfo.result = GameUnfinished;
@@ -3630,7 +3629,7 @@ ParseBoard12(string)
            gameInfo.resultDetails = NULL;
        }
     }
-    
+
     /* In pausing && IcsExamining mode, we ignore boards coming
        in if they are in a different variation than we are. */
     if (pauseExamInvalid) return;
@@ -3641,7 +3640,7 @@ ParseBoard12(string)
            return;
        }
     }
-    
+
   if (appData.debugMode) {
     fprintf(debugFP, "load %dx%d board\n", files, ranks);
   }
@@ -3711,14 +3710,14 @@ ParseBoard12(string)
     /* [HGM] e.p. rights. Assume that ICS sends file number here? */
     epStatus[moveNum] = double_push == -1 ? EP_NONE : double_push + BOARD_LEFT;
 
-    
+
     if (ics_getting_history == H_GOT_REQ_HEADER ||
        ics_getting_history == H_GOT_UNREQ_HEADER) {
        /* This was an initial position from a move list, not
           the current position */
        return;
     }
-    
+
     /* Update currentMove and known move number limits */
     newMove = newGame || moveNum > forwardMostMove;
 
@@ -3752,7 +3751,7 @@ ParseBoard12(string)
        if (!pausing || currentMove > forwardMostMove)
          currentMove = forwardMostMove;
     } else {
-       /* New part of history that is not contiguous with old part */ 
+       /* New part of history that is not contiguous with old part */
        if (pausing && gameMode == IcsExamining) {
            pauseExamInvalid = TRUE;
            forwardMostMove = pauseExamForwardMostMove;
@@ -3773,7 +3772,7 @@ ParseBoard12(string)
        }
        forwardMostMove = backwardMostMove = currentMove = moveNum;
     }
-    
+
     /* Update the clocks */
     if (strchr(elapsed_time, '.')) {
       /* Time is in ms */
@@ -3784,7 +3783,7 @@ ParseBoard12(string)
       timeRemaining[0][moveNum] = whiteTimeRemaining = white_time * 1000;
       timeRemaining[1][moveNum] = blackTimeRemaining = black_time * 1000;
     }
-      
+
 
 #if ZIPPY
     if (appData.zippyPlay && newGame &&
@@ -3792,7 +3791,7 @@ ParseBoard12(string)
        gameMode != IcsExamining)
       ZippyFirstBoard(moveNum, basetime, increment);
 #endif
-    
+
     /* Put the move on the move list, first converting
        to canonical algebraic form. */
     if (moveNum > 0) {
@@ -3823,18 +3822,18 @@ ParseBoard12(string)
            startedFromSetupPosition = TRUE;
            fromX = fromY = toX = toY = -1;
        } else {
-         // [HGM] long SAN: if legality-testing is off, disambiguation might not work or give wrong move. 
+         // [HGM] long SAN: if legality-testing is off, disambiguation might not work or give wrong move.
          //                 So we parse the long-algebraic move string in stead of the SAN move
          int valid; char buf[MSG_SIZ], *prom;
 
          // str looks something like "Q/a1-a2"; kill the slash
-         if(str[1] == '/') 
+         if(str[1] == '/')
                sprintf(buf, "%c%s", str[0], str+2);
          else  strcpy(buf, str); // might be castling
-         if((prom = strstr(move_str, "=")) && !strstr(buf, "=")) 
+         if((prom = strstr(move_str, "=")) && !strstr(buf, "="))
                strcat(buf, prom); // long move lacks promo specification!
          if(!appData.testLegality && move_str[1] != '@') { // drops never ambiguous (parser chokes on long form!)
-               if(appData.debugMode) 
+               if(appData.debugMode)
                        fprintf(debugFP, "replaced ICS move '%s' by '%s'\n", move_str, buf);
                strcpy(move_str, buf);
           }
@@ -3888,7 +3887,7 @@ ParseBoard12(string)
 
 #if ZIPPY
        /* Send move to chess program (BEFORE animating it). */
-       if (appData.zippyPlay && !newGame && newMove && 
+       if (appData.zippyPlay && !newGame && newMove &&
           (!appData.getMoveList || backwardMostMove == 0) && first.initDone) {
 
            if ((gameMode == IcsPlayingWhite && WhiteOnMove(moveNum)) ||
@@ -3937,7 +3936,7 @@ ParseBoard12(string)
            SetHighlights(fromX, fromY, toX, toY);
        }
     }
-    
+
     /* Start the clocks */
     whiteFlag = blackFlag = FALSE;
     appData.clockMode = !(basetime == 0 && increment == 0);
@@ -3954,26 +3953,26 @@ ParseBoard12(string)
       DisplayBothClocks();
     else
       StartClocks();
-    
+
     /* Display opponents and material strengths */
     if (gameInfo.variant != VariantBughouse &&
        gameInfo.variant != VariantCrazyhouse && !appData.noGUI) {
        if (tinyLayout || smallLayout) {
            if(gameInfo.variant == VariantNormal)
-               sprintf(str, "%s(%d) %s(%d) {%d %d}", 
+               sprintf(str, "%s(%d) %s(%d) {%d %d}",
                    gameInfo.white, white_stren, gameInfo.black, black_stren,
                    basetime, increment);
            else
-               sprintf(str, "%s(%d) %s(%d) {%d %d w%d}", 
+               sprintf(str, "%s(%d) %s(%d) {%d %d w%d}",
                    gameInfo.white, white_stren, gameInfo.black, black_stren,
                    basetime, increment, (int) gameInfo.variant);
        } else {
            if(gameInfo.variant == VariantNormal)
-               sprintf(str, "%s (%d) vs. %s (%d) {%d %d}", 
+               sprintf(str, "%s (%d) vs. %s (%d) {%d %d}",
                    gameInfo.white, white_stren, gameInfo.black, black_stren,
                    basetime, increment);
            else
-               sprintf(str, "%s (%d) vs. %s (%d) {%d %d %s}", 
+               sprintf(str, "%s (%d) vs. %s (%d) {%d %d %s}",
                    gameInfo.white, white_stren, gameInfo.black, black_stren,
                    basetime, increment, VariantName(gameInfo.variant));
        }
@@ -3983,12 +3982,11 @@ ParseBoard12(string)
   }
     }
 
-   
+
     /* Display the board */
     if (!pausing && !appData.noGUI) {
-      
       if (appData.premove)
-         if (!gotPremove || 
+         if (!gotPremove ||
             ((gameMode == IcsPlayingWhite) && (WhiteOnMove(currentMove))) ||
             ((gameMode == IcsPlayingBlack) && (!WhiteOnMove(currentMove))))
              ClearPremoveHighlights();
@@ -4007,7 +4005,7 @@ ParseBoard12(string)
     if(bookHit) { // [HGM] book: simulate book reply
        static char bookMove[MSG_SIZ]; // a bit generous?
 
-       programStats.nodes = programStats.depth = programStats.time = 
+       programStats.nodes = programStats.depth = programStats.time =
        programStats.score = programStats.got_only_move = 0;
        sprintf(programStats.movelist, "%s (xbook)", bookHit);
 
@@ -4081,17 +4079,17 @@ SendMoveToProgram(moveNum, cps)
        AlphaRank(moveList[moveNum], 4); // and back
       } else
       /* Added by Tord: Send castle moves in "O-O" in FRC games if required by
-       * the engine. It would be nice to have a better way to identify castle 
+       * the engine. It would be nice to have a better way to identify castle
        * moves here. */
       if((gameInfo.variant == VariantFischeRandom || gameInfo.variant == VariantCapaRandom)
                                                                         && cps->useOOCastle) {
-        int fromX = moveList[moveNum][0] - AAA; 
+        int fromX = moveList[moveNum][0] - AAA;
         int fromY = moveList[moveNum][1] - ONE;
-        int toX = moveList[moveNum][2] - AAA; 
+        int toX = moveList[moveNum][2] - AAA;
         int toY = moveList[moveNum][3] - ONE;
-        if((boards[moveNum][fromY][fromX] == WhiteKing 
+        if((boards[moveNum][fromY][fromX] == WhiteKing
             && boards[moveNum][toY][toX] == WhiteRook)
-           || (boards[moveNum][fromY][fromX] == BlackKing 
+           || (boards[moveNum][fromY][fromX] == BlackKing
                && boards[moveNum][toY][toX] == BlackRook)) {
          if(toX > fromX) SendToProgram("O-O\n", cps);
          else SendToProgram("O-O-O\n", cps);
@@ -4241,7 +4239,7 @@ AlphaRank(char *move, int n)
         fprintf(debugFP, "alphaRank(%s,%d)\n", move, n);
     }
 
-    if(move[1]=='*' && 
+    if(move[1]=='*' &&
        move[2]>='0' && move[2]<='9' &&
        move[3]>='a' && move[3]<='x'    ) {
         move[1] = '@';
@@ -4289,7 +4287,7 @@ ParseOneMove(move, moveNum, moveType, fromX, fromY, toX, toY, promoChar)
      ChessMove *moveType;
      int *fromX, *fromY, *toX, *toY;
      char *promoChar;
-{       
+{
     if (appData.debugMode) {
         fprintf(debugFP, "move to parse: %s\n", move);
     }
@@ -4412,7 +4410,7 @@ int put(Board board, int pieceType, int rank, int n, int shade)
                        board[rank][i] = (ChessSquare) pieceType;
                        squaresLeft[((i-BOARD_LEFT)&1) + 1]--;
                        squaresLeft[ANY]--;
-                       piecesLeft[pieceType]--; 
+                       piecesLeft[pieceType]--;
                        return i;
                }
        }
@@ -4540,7 +4538,7 @@ int SetCharTable( char *table, const char * map )
 {
     int result = FALSE; int NrPieces;
 
-    if( map != NULL && (NrPieces=strlen(map)) <= (int) EmptySquare 
+    if( map != NULL && (NrPieces=strlen(map)) <= (int) EmptySquare
                     && NrPieces >= 12 && !(NrPieces&1)) {
         int i; /* [HGM] Accept even length from 12 to 34 */
 
@@ -4560,30 +4558,30 @@ int SetCharTable( char *table, const char * map )
 
 void Prelude(Board board)
 {      // [HGM] superchess: random selection of exo-pieces
-       int i, j, k; ChessSquare p; 
+       int i, j, k; ChessSquare p;
        static ChessSquare exoPieces[4] = { WhiteAngel, WhiteMarshall, WhiteSilver, WhiteLance };
 
        GetPositionNumber(); // use FRC position number
 
        if(appData.pieceToCharTable != NULL) { // select pieces to participate from given char table
            SetCharTable(pieceToChar, appData.pieceToCharTable);
-           for(i=(int)WhiteQueen+1, j=0; i<(int)WhiteKing && j<4; i++) 
+           for(i=(int)WhiteQueen+1, j=0; i<(int)WhiteKing && j<4; i++)
                if(PieceToChar((ChessSquare)i) != '.') exoPieces[j++] = (ChessSquare) i;
        }
 
-       j = seed%4;                 seed /= 4; 
+       j = seed%4;                 seed /= 4;
        p = board[0][BOARD_LEFT+j];   board[0][BOARD_LEFT+j] = EmptySquare; k = PieceToNumber(p);
        board[k][BOARD_WIDTH-1] = p;  board[k][BOARD_WIDTH-2]++;
        board[BOARD_HEIGHT-1-k][0] = WHITE_TO_BLACK p;  board[BOARD_HEIGHT-1-k][1]++;
-       j = seed%3 + (seed%3 >= j); seed /= 3; 
+       j = seed%3 + (seed%3 >= j); seed /= 3;
        p = board[0][BOARD_LEFT+j];   board[0][BOARD_LEFT+j] = EmptySquare; k = PieceToNumber(p);
        board[k][BOARD_WIDTH-1] = p;  board[k][BOARD_WIDTH-2]++;
        board[BOARD_HEIGHT-1-k][0] = WHITE_TO_BLACK p;  board[BOARD_HEIGHT-1-k][1]++;
-       j = seed%3;                 seed /= 3; 
+       j = seed%3;                 seed /= 3;
        p = board[0][BOARD_LEFT+j+5]; board[0][BOARD_LEFT+j+5] = EmptySquare; k = PieceToNumber(p);
        board[k][BOARD_WIDTH-1] = p;  board[k][BOARD_WIDTH-2]++;
        board[BOARD_HEIGHT-1-k][0] = WHITE_TO_BLACK p;  board[BOARD_HEIGHT-1-k][1]++;
-       j = seed%2 + (seed%2 >= j); seed /= 2; 
+       j = seed%2 + (seed%2 >= j); seed /= 2;
        p = board[0][BOARD_LEFT+j+5]; board[0][BOARD_LEFT+j+5] = EmptySquare; k = PieceToNumber(p);
        board[k][BOARD_WIDTH-1] = p;  board[k][BOARD_WIDTH-2]++;
        board[BOARD_HEIGHT-1-k][0] = WHITE_TO_BLACK p;  board[BOARD_HEIGHT-1-k][1]++;
@@ -4621,7 +4619,7 @@ InitPosition(redraw)
         castlingRank[3] = castlingRank[4] = castlingRank[5] = BOARD_HEIGHT-1;
     }
 
-    
+
     /* [HGM] logic here is completely changed. In stead of full positions */
     /* the initialized data only consist of the two backranks. The switch */
     /* selects which one we will use, which is than copied to the Board   */
@@ -4635,7 +4633,7 @@ InitPosition(redraw)
     gameInfo.holdingsSize  = 0;
     nrCastlingRights = -1; /* [HGM] Kludge to indicate default should be used */
     for(i=0; i<BOARD_SIZE; i++) initialRights[i] = -1; /* but no rights yet */
-    SetCharTable(pieceToChar, "PNBRQ...........Kpnbrq...........k"); 
+    SetCharTable(pieceToChar, "PNBRQ...........Kpnbrq...........k");
 
     switch (gameInfo.variant) {
     case VariantFischeRandom:
@@ -4646,7 +4644,7 @@ InitPosition(redraw)
     case VariantShatranj:
       pieces = ShatranjArray;
       nrCastlingRights = 0;
-      SetCharTable(pieceToChar, "PN.R.QB...Kpn.r.qb...k"); 
+      SetCharTable(pieceToChar, "PN.R.QB...Kpn.r.qb...k");
       break;
     case VariantTwoKings:
       pieces = twoKingsArray;
@@ -4656,17 +4654,17 @@ InitPosition(redraw)
     case VariantCapablanca:
       pieces = CapablancaArray;
       gameInfo.boardWidth = 10;
-      SetCharTable(pieceToChar, "PNBRQ..ACKpnbrq..ack"); 
+      SetCharTable(pieceToChar, "PNBRQ..ACKpnbrq..ack");
       break;
     case VariantGothic:
       pieces = GothicArray;
       gameInfo.boardWidth = 10;
-      SetCharTable(pieceToChar, "PNBRQ..ACKpnbrq..ack"); 
+      SetCharTable(pieceToChar, "PNBRQ..ACKpnbrq..ack");
       break;
     case VariantJanus:
       pieces = JanusArray;
       gameInfo.boardWidth = 10;
-      SetCharTable(pieceToChar, "PNBRQ..JKpnbrq..jk"); 
+      SetCharTable(pieceToChar, "PNBRQ..JKpnbrq..jk");
       nrCastlingRights = 6;
         castlingRights[0][0] = initialRights[0] = BOARD_RGHT-1;
         castlingRights[0][1] = initialRights[1] = BOARD_LEFT;
@@ -4678,14 +4676,14 @@ InitPosition(redraw)
     case VariantFalcon:
       pieces = FalconArray;
       gameInfo.boardWidth = 10;
-      SetCharTable(pieceToChar, "PNBRQ.............FKpnbrq.............fk"); 
+      SetCharTable(pieceToChar, "PNBRQ.............FKpnbrq.............fk");
       break;
     case VariantXiangqi:
       pieces = XiangqiArray;
       gameInfo.boardWidth  = 9;
       gameInfo.boardHeight = 10;
       nrCastlingRights = 0;
-      SetCharTable(pieceToChar, "PH.R.AE..K.C.ph.r.ae..k.c."); 
+      SetCharTable(pieceToChar, "PH.R.AE..K.C.ph.r.ae..k.c.");
       break;
     case VariantShogi:
       pieces = ShogiArray;
@@ -4693,22 +4691,22 @@ InitPosition(redraw)
       gameInfo.boardHeight = 9;
       gameInfo.holdingsSize = 7;
       nrCastlingRights = 0;
-      SetCharTable(pieceToChar, "PNBRLS...G.++++++Kpnbrls...g.++++++k"); 
+      SetCharTable(pieceToChar, "PNBRLS...G.++++++Kpnbrls...g.++++++k");
       break;
     case VariantCourier:
       pieces = CourierArray;
       gameInfo.boardWidth  = 12;
       nrCastlingRights = 0;
-      SetCharTable(pieceToChar, "PNBR.FE..WMKpnbr.fe..wmk"); 
+      SetCharTable(pieceToChar, "PNBR.FE..WMKpnbr.fe..wmk");
       for(i=0; i<BOARD_SIZE; i++) initialRights[i] = -1;
       break;
     case VariantKnightmate:
       pieces = KnightmateArray;
-      SetCharTable(pieceToChar, "P.BRQ.....M.........K.p.brq.....m.........k."); 
+      SetCharTable(pieceToChar, "P.BRQ.....M.........K.p.brq.....m.........k.");
       break;
     case VariantFairy:
       pieces = fairyArray;
-      SetCharTable(pieceToChar, "PNBRQFEACWMOHIJGDVSLUKpnbrqfeacwmohijgdvsluk"); 
+      SetCharTable(pieceToChar, "PNBRQFEACWMOHIJGDVSLUKpnbrqfeacwmohijgdvsluk");
       break;
     case VariantGreat:
       pieces = GreatArray;
@@ -4725,7 +4723,7 @@ InitPosition(redraw)
     case VariantCrazyhouse:
     case VariantBughouse:
       pieces = FIDEArray;
-      SetCharTable(pieceToChar, "PNBRQ.......~~~~Kpnbrq.......~~~~k"); 
+      SetCharTable(pieceToChar, "PNBRQ.......~~~~Kpnbrq.......~~~~k");
       gameInfo.holdingsSize = 5;
       break;
     case VariantWildCastle:
@@ -4779,7 +4777,7 @@ InitPosition(redraw)
         initialPosition[BOARD_HEIGHT-pawnRow-1][j] = BlackPawn;
         if(gameInfo.variant == VariantXiangqi) {
             if(j&1) {
-                initialPosition[pawnRow][j] = 
+                initialPosition[pawnRow][j] =
                 initialPosition[BOARD_HEIGHT-pawnRow-1][j] = EmptySquare;
                 if(j==BOARD_LEFT+1 || j>=BOARD_RGHT-2) {
                    initialPosition[2][j] = WhiteCannon;
@@ -4804,7 +4802,7 @@ InitPosition(redraw)
         /*       This sets default castling rights from none to normal corners   */
         /* Variants with other castling rights must set them themselves above    */
         nrCastlingRights = 6;
-       
+
         castlingRights[0][0] = initialRights[0] = BOARD_RGHT-1;
         castlingRights[0][1] = initialRights[1] = BOARD_LEFT;
         castlingRights[0][2] = initialRights[2] = BOARD_WIDTH>>1;
@@ -4836,7 +4834,6 @@ InitPosition(redraw)
     }
 
     CopyBoard(boards[0], initialPosition);
-
     if(oldx != gameInfo.boardWidth ||
        oldy != gameInfo.boardHeight ||
        oldh != gameInfo.holdingsWidth
@@ -4849,10 +4846,13 @@ InitPosition(redraw)
        gameInfo.variant == VariantFalcon
 #endif
                                          )
+      {
             InitDrawingSizes(-2 ,0);
+      }
 
     if (redraw)
       DrawPosition(TRUE, boards[currentMove]);
+
 }
 
 void
@@ -4861,7 +4861,7 @@ SendBoard(cps, moveNum)
      int moveNum;
 {
     char message[MSG_SIZ];
-    
+
     if (cps->useSetboard) {
       char* fen = PositionToFEN(moveNum, cps->fenOverride);
       sprintf(message, "setboard %s\n", fen);
@@ -4882,7 +4882,7 @@ SendBoard(cps, moveNum)
        bp = &boards[moveNum][i][BOARD_LEFT];
         for (j = BOARD_LEFT; j < BOARD_RGHT; j++, bp++) {
          if ((int) *bp < (int) BlackPawn) {
-           sprintf(message, "%c%c%c\n", PieceToChar(*bp), 
+           sprintf(message, "%c%c%c\n", PieceToChar(*bp),
                     AAA + j, ONE + i);
             if(message[0] == '+' || message[0] == '~') {
                 sprintf(message, "%c%c%c+\n",
@@ -4897,7 +4897,7 @@ SendBoard(cps, moveNum)
          }
        }
       }
-    
+
       SendToProgram("c\n", cps);
       for (i = BOARD_HEIGHT - 1; i >= 0; i--) {
        bp = &boards[moveNum][i][BOARD_LEFT];
@@ -4919,7 +4919,7 @@ SendBoard(cps, moveNum)
          }
        }
       }
-    
+
       SendToProgram(".\n", cps);
     }
     setboardSpoiledMachineBlack = 0; /* [HGM] assume WB 4.2.7 already solves this after sending setboard */
@@ -5089,11 +5089,11 @@ OKToStartUserMove(x, y)
        if (!white_piece && WhiteOnMove(currentMove)) {
            DisplayMoveError(_("It is White's turn"));
            return FALSE;
-       }           
+       }
        if (white_piece && !WhiteOnMove(currentMove)) {
            DisplayMoveError(_("It is Black's turn"));
            return FALSE;
-       }           
+       }
        if (cmailMsgLoaded && (currentMove < cmailOldMove)) {
            /* Editing correspondence game history */
            /* Could disallow this or prompt for confirmation */
@@ -5116,16 +5116,16 @@ OKToStartUserMove(x, y)
            }
        }
        break;
-       
+
       case Training:
        if (!white_piece && WhiteOnMove(currentMove)) {
            DisplayMoveError(_("It is White's turn"));
            return FALSE;
-       }           
+       }
        if (white_piece && !WhiteOnMove(currentMove)) {
            DisplayMoveError(_("It is Black's turn"));
            return FALSE;
-       }           
+       }
        break;
 
       default:
@@ -5226,7 +5226,7 @@ UserMoveTest(fromX, fromY, toX, toY, promoChar, captureOwn)
                premoveFromY = fromY;
                premovePromoChar = promoChar;
                gotPremove = 1;
-               if (appData.debugMode) 
+               if (appData.debugMode)
                    fprintf(debugFP, "Got premove: fromX %d,"
                            "fromY %d, toX %d, toY %d\n",
                            fromX, fromY, toX, toY);
@@ -5247,7 +5247,7 @@ UserMoveTest(fromX, fromY, toX, toY, promoChar, captureOwn)
                premoveFromY = fromY;
                premovePromoChar = promoChar;
                gotPremove = 1;
-               if (appData.debugMode) 
+               if (appData.debugMode)
                    fprintf(debugFP, "Got premove: fromX %d,"
                            "fromY %d, toX %d, toY %d\n",
                            fromX, fromY, toX, toY);
@@ -5278,7 +5278,7 @@ UserMoveTest(fromX, fromY, toX, toY, promoChar, captureOwn)
     pup = boards[currentMove][toY][toX];
 
     /* [HGM] If move started in holdings, it means a drop */
-    if( fromX == BOARD_LEFT-2 || fromX == BOARD_RGHT+1) { 
+    if( fromX == BOARD_LEFT-2 || fromX == BOARD_RGHT+1) {
          if( pup != EmptySquare ) return ImpossibleMove;
          if(appData.testLegality) {
              /* it would be more logical if LegalityTest() also figured out
@@ -5293,7 +5293,7 @@ UserMoveTest(fromX, fromY, toX, toY, promoChar, captureOwn)
     }
 
     userOfferedDraw = FALSE;
-       
+
     /* [HGM] always test for legality, to get promotion info */
     moveType = LegalityTest(boards[currentMove], PosFlags(currentMove),
                           epStatus[currentMove], castlingRights[currentMove],
@@ -5305,7 +5305,7 @@ UserMoveTest(fromX, fromY, toX, toY, promoChar, captureOwn)
             return ImpossibleMove;
        }
     }
-if(appData.debugMode) fprintf(debugFP, "moveType 3 = %d, promochar = %x\n", moveType, promoChar);
+    if(appData.debugMode) fprintf(debugFP, "moveType 3 = %d, promochar = %x\n", moveType, promoChar);
     return moveType;
     /* [HGM] <popupFix> in stead of calling FinishMove directly, this
        function is made into one that returns an OK move type if FinishMove
@@ -5323,43 +5323,63 @@ FinishMove(moveType, fromX, fromY, toX, toY, promoChar)
      int fromX, fromY, toX, toY;
      /*char*/int promoChar;
 {
-    char *bookHit = 0;
-if(appData.debugMode) fprintf(debugFP, "moveType 5 = %d, promochar = %x\n", moveType, promoChar);
-    if((gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat) && promoChar != NULLCHAR) { 
-       // [HGM] superchess: suppress promotions to non-available piece
-       int k = PieceToNumber(CharToPiece(ToUpper(promoChar)));
-       if(WhiteOnMove(currentMove)) {
-           if(!boards[currentMove][k][BOARD_WIDTH-2]) return 0;
-       } else {
-           if(!boards[currentMove][BOARD_HEIGHT-1-k][1]) return 0;
+  char *bookHit = 0;
+
+  if(appData.debugMode)
+    fprintf(debugFP, "moveType 5 = %d, promochar = %x\n", moveType, promoChar);
+
+  if((gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat) && promoChar != NULLCHAR)
+    {
+      // [HGM] superchess: suppress promotions to non-available piece
+      int k = PieceToNumber(CharToPiece(ToUpper(promoChar)));
+      if(WhiteOnMove(currentMove))
+       {
+         if(!boards[currentMove][k][BOARD_WIDTH-2])
+           return 0;
+       }
+      else
+       {
+         if(!boards[currentMove][BOARD_HEIGHT-1-k][1])
+           return 0;
        }
     }
+  
+  /* [HGM] <popupFix> kludge to avoid having to know the exact promotion
+     move type in caller when we know the move is a legal promotion */
+  if(moveType == NormalMove && promoChar)
+    moveType = PromoCharToMoveType(WhiteOnMove(currentMove), promoChar);
 
-    /* [HGM] <popupFix> kludge to avoid having to know the exact promotion
-       move type in caller when we know the move is a legal promotion */
-    if(moveType == NormalMove && promoChar)
-        moveType = PromoCharToMoveType(WhiteOnMove(currentMove), promoChar);
-if(appData.debugMode) fprintf(debugFP, "moveType 1 = %d, promochar = %x\n", moveType, promoChar);
-    /* [HGM] convert drag-and-drop piece drops to standard form */
-    if( fromX == BOARD_LEFT-2 || fromX == BOARD_RGHT+1) {
-         moveType = WhiteOnMove(currentMove) ? WhiteDrop : BlackDrop;
-          if(appData.debugMode) fprintf(debugFP, "Drop move %d, curr=%d, x=%d,y=%d, p=%d\n", 
+  if(appData.debugMode) 
+    fprintf(debugFP, "moveType 1 = %d, promochar = %x\n", moveType, promoChar);
+
+  /* [HGM] convert drag-and-drop piece drops to standard form */
+  if( fromX == BOARD_LEFT-2 || fromX == BOARD_RGHT+1) 
+    {
+      moveType = WhiteOnMove(currentMove) ? WhiteDrop : BlackDrop;
+      if(appData.debugMode) 
+       fprintf(debugFP, "Drop move %d, curr=%d, x=%d,y=%d, p=%d\n", 
                moveType, currentMove, fromX, fromY, boards[currentMove][fromY][fromX]);
-//         fromX = boards[currentMove][fromY][fromX];
-          // holdings might not be sent yet in ICS play; we have to figure out which piece belongs here
-          if(fromX == 0) fromY = BOARD_HEIGHT-1 - fromY; // black holdings upside-down
-          fromX = fromX ? WhitePawn : BlackPawn; // first piece type in selected holdings
-          while(PieceToChar(fromX) == '.' || PieceToNumber(fromX) != fromY && fromX != (int) EmptySquare) fromX++; 
-         fromY = DROP_RANK;
-    }
-
-    /* [HGM] <popupFix> The following if has been moved here from
-       UserMoveEvent(). Because it seemed to belon here (why not allow
-       piece drops in training games?), and because it can only be
-       performed after it is known to what we promote. */
-    if (gameMode == Training) {
+      //         fromX = boards[currentMove][fromY][fromX];
+      // holdings might not be sent yet in ICS play; we have to figure out which piece belongs here
+      if(fromX == 0) 
+       fromY = BOARD_HEIGHT-1 - fromY; // black holdings upside-down
+
+      fromX = fromX ? WhitePawn : BlackPawn; // first piece type in selected holdings
+
+      while(PieceToChar(fromX) == '.' || PieceToNumber(fromX) != fromY && fromX != (int) EmptySquare) 
+       fromX++; 
+
+      fromY = DROP_RANK;
+    }
+
+  /* [HGM] <popupFix> The following if has been moved here from
+     UserMoveEvent(). Because it seemed to belon here (why not allow
+     piece drops in training games?), and because it can only be
+     performed after it is known to what we promote. */
+  if (gameMode == Training)
+    {
       /* compare the move played on the board to the next move in the
-       * game. If they match, display the move and the opponent's response. 
+       * game. If they match, display the move and the opponent's response.
        * If they don't match, display an error message.
        */
       int saveAnimate;
@@ -5367,36 +5387,41 @@ if(appData.debugMode) fprintf(debugFP, "moveType 1 = %d, promochar = %x\n", move
       CopyBoard(testBoard, boards[currentMove]);
       ApplyMove(fromX, fromY, toX, toY, promoChar, testBoard, testRights, &testStatus);
 
-      if (CompareBoards(testBoard, boards[currentMove+1])) {
-       ForwardInner(currentMove+1);
+      if (CompareBoards(testBoard, boards[currentMove+1]))
+       {
+         ForwardInner(currentMove+1);
 
-       /* Autoplay the opponent's response.
-        * if appData.animate was TRUE when Training mode was entered,
-        * the response will be animated.
-        */
-       saveAnimate = appData.animate;
-       appData.animate = animateTraining;
-       ForwardInner(currentMove+1);
-       appData.animate = saveAnimate;
-
-       /* check for the end of the game */
-       if (currentMove >= forwardMostMove) {
-         gameMode = PlayFromGameFile;
-         ModeHighlight();
-         SetTrainingModeOff();
-         DisplayInformation(_("End of game"));
+         /* Autoplay the opponent's response.
+          * if appData.animate was TRUE when Training mode was entered,
+          * the response will be animated.
+          */
+         saveAnimate = appData.animate;
+         appData.animate = animateTraining;
+         ForwardInner(currentMove+1);
+         appData.animate = saveAnimate;
+
+         /* check for the end of the game */
+         if (currentMove >= forwardMostMove)
+           {
+             gameMode = PlayFromGameFile;
+             ModeHighlight();
+             SetTrainingModeOff();
+             DisplayInformation(_("End of game"));
+           }
+       }
+      else
+       {
+         DisplayError(_("Incorrect move"), 0);
        }
-      } else {
-       DisplayError(_("Incorrect move"), 0);
-      }
       return 1;
     }
 
   /* Ok, now we know that the move is good, so we can kill
      the previous line in Analysis Mode */
-  if (gameMode == AnalyzeMode && currentMove < forwardMostMove) {
-    forwardMostMove = currentMove;
-  }
+  if (gameMode == AnalyzeMode && currentMove < forwardMostMove)
+    {
+      forwardMostMove = currentMove;
+    }
 
   /* If we need the chess program but it's dead, restart it */
   ResurrectChessProgram();
@@ -5409,93 +5434,115 @@ if(appData.debugMode) fprintf(debugFP, "moveType 1 = %d, promochar = %x\n", move
 
   MakeMove(fromX, fromY, toX, toY, promoChar); /*updates forwardMostMove*/
 
-  if (gameMode == BeginningOfGame) {
-    if (appData.noChessProgram) {
-      gameMode = EditGame;
-      SetGameInfo();
-    } else {
-      char buf[MSG_SIZ];
-      gameMode = MachinePlaysBlack;
-      StartClocks();
-      SetGameInfo();
-      sprintf(buf, "%s vs. %s", gameInfo.white, gameInfo.black);
-      DisplayTitle(buf);
-      if (first.sendName) {
-       sprintf(buf, "name %s\n", gameInfo.white);
-       SendToProgram(buf, &first);
-      }
-      StartClocks();
+  if (gameMode == BeginningOfGame)
+    {
+      if (appData.noChessProgram)
+       {
+         gameMode = EditGame;
+         SetGameInfo();
+       }
+      else
+       {
+         char buf[MSG_SIZ];
+         gameMode = MachinePlaysBlack;
+         StartClocks();
+         SetGameInfo();
+         sprintf(buf, "%s vs. %s", gameInfo.white, gameInfo.black);
+         DisplayTitle(buf);
+         if (first.sendName)
+           {
+             sprintf(buf, "name %s\n", gameInfo.white);
+             SendToProgram(buf, &first);
+           }
+         StartClocks();
+       }
+      ModeHighlight();
     }
-    ModeHighlight();
-  }
-if(appData.debugMode) fprintf(debugFP, "moveType 2 = %d, promochar = %x\n", moveType, promoChar);
+  if(appData.debugMode) fprintf(debugFP, "moveType 2 = %d, promochar = %x\n", moveType, promoChar);
+
   /* Relay move to ICS or chess engine */
-  if (appData.icsActive) {
-    if (gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack ||
-       gameMode == IcsExamining) {
-      SendMoveToICS(moveType, fromX, fromY, toX, toY);
-      ics_user_moved = 1;
+  if (appData.icsActive)
+    {
+      if (gameMode == IcsPlayingWhite || gameMode == IcsPlayingBlack ||
+         gameMode == IcsExamining)
+       {
+         SendMoveToICS(moveType, fromX, fromY, toX, toY);
+         ics_user_moved = 1;
+       }
     }
-  } else {
-    if (first.sendTime && (gameMode == BeginningOfGame ||
-                          gameMode == MachinePlaysWhite ||
-                          gameMode == MachinePlaysBlack)) {
-      SendTimeRemaining(&first, gameMode != MachinePlaysBlack);
-    }
-    if (gameMode != EditGame && gameMode != PlayFromGameFile) {
-        // [HGM] book: if program might be playing, let it use book
-       bookHit = SendMoveToBookUser(forwardMostMove-1, &first, FALSE);
-       first.maybeThinking = TRUE;
-    } else SendMoveToProgram(forwardMostMove-1, &first);
-    if (currentMove == cmailOldMove + 1) {
-      cmailMoveType[lastLoadGameNumber - 1] = CMAIL_MOVE;
+  else
+    {
+      if (first.sendTime && (gameMode == BeginningOfGame ||
+                            gameMode == MachinePlaysWhite ||
+                            gameMode == MachinePlaysBlack))
+       {
+         SendTimeRemaining(&first, gameMode != MachinePlaysBlack);
+       }
+      if (gameMode != EditGame && gameMode != PlayFromGameFile)
+       {
+         // [HGM] book: if program might be playing, let it use book
+         bookHit = SendMoveToBookUser(forwardMostMove-1, &first, FALSE);
+         first.maybeThinking = TRUE;
+       }
+      else
+       SendMoveToProgram(forwardMostMove-1, &first);
+      if (currentMove == cmailOldMove + 1)
+       {
+         cmailMoveType[lastLoadGameNumber - 1] = CMAIL_MOVE;
+       }
     }
-  }
 
   ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/
 
-  switch (gameMode) {
-  case EditGame:
-    switch (MateTest(boards[currentMove], PosFlags(currentMove),
-                     EP_UNKNOWN, castlingRights[currentMove]) ) {
-    case MT_NONE:
-    case MT_CHECK:
+  switch (gameMode)
+    {
+    case EditGame:
+      switch (MateTest(boards[currentMove], PosFlags(currentMove),
+                      EP_UNKNOWN, castlingRights[currentMove]) )
+       {
+       case MT_NONE:
+       case MT_CHECK:
+         break;
+       case MT_CHECKMATE:
+       case MT_STAINMATE:
+         if (WhiteOnMove(currentMove))
+           {
+             GameEnds(BlackWins, "Black mates", GE_PLAYER);
+           }
+         else
+           {
+             GameEnds(WhiteWins, "White mates", GE_PLAYER);
+           }
+         break;
+       case MT_STALEMATE:
+         GameEnds(GameIsDrawn, "Stalemate", GE_PLAYER);
+         break;
+    }
       break;
-    case MT_CHECKMATE:
-    case MT_STAINMATE:
-      if (WhiteOnMove(currentMove)) {
-       GameEnds(BlackWins, "Black mates", GE_PLAYER);
-      } else {
-       GameEnds(WhiteWins, "White mates", GE_PLAYER);
-      }
+
+    case MachinePlaysBlack:
+    case MachinePlaysWhite:
+      /* disable certain menu options while machine is thinking */
+      SetMachineThinkingEnables();
       break;
-    case MT_STALEMATE:
-      GameEnds(GameIsDrawn, "Stalemate", GE_PLAYER);
+
+    default:
       break;
     }
-    break;
-    
-  case MachinePlaysBlack:
-  case MachinePlaysWhite:
-    /* disable certain menu options while machine is thinking */
-    SetMachineThinkingEnables();
-    break;
 
-  default:
-    break;
-  }
+  if(bookHit)
+    { // [HGM] book: simulate book reply
+      static char bookMove[MSG_SIZ]; // a bit generous?
 
-  if(bookHit) { // [HGM] book: simulate book reply
-       static char bookMove[MSG_SIZ]; // a bit generous?
-
-       programStats.nodes = programStats.depth = programStats.time = 
+      programStats.nodes = programStats.depth = programStats.time =
        programStats.score = programStats.got_only_move = 0;
-       sprintf(programStats.movelist, "%s (xbook)", bookHit);
+      sprintf(programStats.movelist, "%s (xbook)", bookHit);
+
+      strcpy(bookMove, "move ");
+      strcat(bookMove, bookHit);
+      HandleMachineMove(bookMove, &first);
+    }
 
-       strcpy(bookMove, "move ");
-       strcat(bookMove, bookHit);
-       HandleMachineMove(bookMove, &first);
-  }
   return 1;
 }
 
@@ -5511,7 +5558,7 @@ UserMoveEvent(fromX, fromY, toX, toY, promoChar)
        slip a promotion popup in between. But that it always needs two
        calls, to the first part, (now called UserMoveTest() ), and to
        FinishMove if the first part succeeded. Calls that do not need
-       to do anything in between, can call this routine the old way. 
+       to do anything in between, can call this routine the old way.
     */
     ChessMove moveType = UserMoveTest(fromX, fromY, toX, toY, promoChar, FALSE);
 if(appData.debugMode) fprintf(debugFP, "moveType 4 = %d, promochar = %x\n", moveType, promoChar);
@@ -5758,7 +5805,7 @@ char *SendMoveToBookUser(int moveNr, ChessProgramState *cps, int initial)
        cps->bookSuspend = FALSE; // after a 'go' we are never suspended
     } else { // 'go' might be sent based on 'firstMove' after this routine returns
        if(cps->bookSuspend && !firstMove) // 'go' needed, and it will not be done after we return
-           SendToProgram("go\n", cps); 
+           SendToProgram("go\n", cps);
        cps->bookSuspend = FALSE; // anyhow, we will not be suspended after a miss
     }
     return bookHit; // notify caller of hit, so it can take action to send move to opponent
@@ -5825,7 +5872,7 @@ FakeBookMove: // [HGM] book: we jump here to simulate machine moves after book h
      * Look for machine move.
      */
     if ((sscanf(message, "%s %s %s", buf1, buf2, machineMove) == 3 && strcmp(buf2, "...") == 0) ||
-       (sscanf(message, "%s %s", buf1, machineMove) == 2 && strcmp(buf1, "move") == 0)) 
+       (sscanf(message, "%s %s", buf1, machineMove) == 2 && strcmp(buf1, "move") == 0))
     {
         /* This method is only useful on engines that support ping */
         if (cps->lastPing != cps->lastPong) {
@@ -6016,8 +6063,8 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
             if( count >= adjudicateLossPlies ) {
                ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/
 
-                GameEnds( WhiteOnMove(forwardMostMove) ? WhiteWins : BlackWins, 
-                    "Xboard adjudication", 
+                GameEnds( WhiteOnMove(forwardMostMove) ? WhiteWins : BlackWins,
+                    "Xboard adjudication",
                     GE_XBOARD );
 
                 return;
@@ -6069,7 +6116,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
                              NrWQ++; break;
                         case BlackQueen:
                              NrBQ++; break;
-                        case EmptySquare: 
+                        case EmptySquare:
                              break;
                         case BlackPawn:
                              m = 7-i;
@@ -6078,7 +6125,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
                     }
                     NrPieces += (p != EmptySquare);
                     NrW += ((int)p < (int)BlackPawn);
-                   if(gameInfo.variant == VariantXiangqi && 
+                   if(gameInfo.variant == VariantXiangqi &&
                      (p == WhiteFerz || p == WhiteAlfil || p == BlackFerz || p == BlackAlfil)) {
                        NrPieces--; // [HGM] XQ: do not count purely defensive pieces
                         NrW -= ((int)p < (int)BlackPawn);
@@ -6092,7 +6139,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
                     if(appData.checkMates) {
                         SendMoveToProgram(forwardMostMove-1, cps->other); // make sure opponent gets move
                          ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/
-                         GameEnds( WhiteOnMove(forwardMostMove) ? BlackWins : WhiteWins, 
+                         GameEnds( WhiteOnMove(forwardMostMove) ? BlackWins : WhiteWins,
                                                        "Xboard adjudication: King destroyed", GE_XBOARD );
                          return;
                     }
@@ -6105,7 +6152,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
                     if(appData.checkMates) {
                         SendMoveToProgram(forwardMostMove-1, cps->other); // make sure opponent gets to see move
                          ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/
-                         GameEnds( WhiteOnMove(forwardMostMove) ? WhiteWins : BlackWins, 
+                         GameEnds( WhiteOnMove(forwardMostMove) ? WhiteWins : BlackWins,
                                                        "Xboard adjudication: Bare king", GE_XBOARD );
                          return;
                     }
@@ -6117,7 +6164,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
                            /* but only adjudicate if adjudication enabled */
                            SendMoveToProgram(forwardMostMove-1, cps->other); // make sure opponent gets move
                            ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/
-                           GameEnds( NrW > 1 ? WhiteWins : NrPieces - NrW > 1 ? BlackWins : GameIsDrawn, 
+                           GameEnds( NrW > 1 ? WhiteWins : NrPieces - NrW > 1 ? BlackWins : GameIsDrawn,
                                                        "Xboard adjudication: Bare king", GE_XBOARD );
                            return;
                        }
@@ -6183,7 +6230,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
                }
 
                 /* Next absolutely insufficient mating material. */
-                if( NrPieces == 2 || gameInfo.variant != VariantXiangqi && 
+                if( NrPieces == 2 || gameInfo.variant != VariantXiangqi &&
                                     gameInfo.variant != VariantShatranj && // [HGM] baring will remain possible
                        (NrPieces == 3 && NrWN+NrBN+NrWB+NrBB == 1 ||
                         NrPieces == NrBB+NrWB+2 && bishopsColor != 3)) // [HGM] all Bishops (Ferz!) same color
@@ -6203,7 +6250,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
                 }
 
                 /* Then some trivial draws (only adjudicate, cannot be claimed) */
-                if(NrPieces == 4 && 
+                if(NrPieces == 4 &&
                    (   NrWR == 1 && NrBR == 1 /* KRKR */
                    || NrWQ==1 && NrBQ==1     /* KQKQ */
                    || NrWN==2 || NrBN==2     /* KNNK */
@@ -6250,7 +6297,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
                         }
                         if( castlingRights[forwardMostMove][5] != castlingRights[k][5] &&
                              (castlingRights[k][3] >= 0 || castlingRights[k][4] >= 0) )
-                                rights++; 
+                                rights++;
                         if( castlingRights[forwardMostMove][5] >= 0 ) {
                             if( castlingRights[forwardMostMove][3] != castlingRights[k][3] ||
                                 castlingRights[forwardMostMove][4] != castlingRights[k][4] )
@@ -6262,21 +6309,21 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
                             SendToProgram("force\n", cps->other); // suppress reply
                             SendMoveToProgram(forwardMostMove-1, cps->other); /* make sure opponent gets to see move */
                              ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/
-                            if(gameInfo.variant == VariantXiangqi && appData.testLegality) { 
+                            if(gameInfo.variant == VariantXiangqi && appData.testLegality) {
                                // [HGM] xiangqi: check for forbidden perpetuals
                                int m, ourPerpetual = 1, hisPerpetual = 1;
                                for(m=forwardMostMove; m>k; m-=2) {
-                                   if(MateTest(boards[m], PosFlags(m), 
+                                   if(MateTest(boards[m], PosFlags(m),
                                                        EP_NONE, castlingRights[m]) != MT_CHECK)
                                        ourPerpetual = 0; // the current mover did not always check
-                                   if(MateTest(boards[m-1], PosFlags(m-1), 
+                                   if(MateTest(boards[m-1], PosFlags(m-1),
                                                        EP_NONE, castlingRights[m-1]) != MT_CHECK)
                                        hisPerpetual = 0; // the opponent did not always check
                                }
                                if(appData.debugMode) fprintf(debugFP, "XQ perpetual test, our=%d, his=%d\n",
                                                                        ourPerpetual, hisPerpetual);
                                if(ourPerpetual && !hisPerpetual) { // we are actively checking him: forfeit
-                                   GameEnds( WhiteOnMove(forwardMostMove) ? WhiteWins : BlackWins, 
+                                   GameEnds( WhiteOnMove(forwardMostMove) ? WhiteWins : BlackWins,
                                           "Xboard adjudication: perpetual checking", GE_XBOARD );
                                    return;
                                }
@@ -6287,7 +6334,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
                                    hisPerpetual = PerpetualChase(k, forwardMostMove);
                                    ourPerpetual = PerpetualChase(k+1, forwardMostMove);
                                    if(ourPerpetual && !hisPerpetual) { // we are actively chasing him: forfeit
-                                       GameEnds( WhiteOnMove(forwardMostMove) ? WhiteWins : BlackWins, 
+                                       GameEnds( WhiteOnMove(forwardMostMove) ? WhiteWins : BlackWins,
                                                      "Xboard adjudication: perpetual chasing", GE_XBOARD );
                                        return;
                                    }
@@ -6312,7 +6359,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
                 /* if we hit starting position, add initial plies */
                 if( count == backwardMostMove )
                     count -= initialRulePlies;
-                count = forwardMostMove - count; 
+                count = forwardMostMove - count;
                 if( count >= 100)
                          epStatus[forwardMostMove] = EP_RULE_DRAW;
                          /* this is used to judge if draw claims are legal */
@@ -6381,12 +6428,12 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
        }
 
        ShowMove(fromX, fromY, toX, toY); /*updates currentMove*/
-       
+
         if (!pausing && appData.ringBellAfterMoves) {
            RingBell();
        }
 
-       /* 
+       /*
         * Reenable menu items that were disabled while
         * machine was thinking
         */
@@ -6403,7 +6450,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
                strcat(bookMove, bookHit);
                message = bookMove;
                cps = cps->other;
-               programStats.nodes = programStats.depth = programStats.time = 
+               programStats.nodes = programStats.depth = programStats.time =
                programStats.score = programStats.got_only_move = 0;
                sprintf(programStats.movelist, "%s (xbook)", bookHit);
 
@@ -6452,7 +6499,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
            for( i=0; i<nrCastlingRights; i++ )
                 castlingRights[0][i] = FENcastlingRights[i];
            if(blackPlaysFirst) gameMode = MachinePlaysWhite;
-           else gameMode = MachinePlaysBlack;                 
+           else gameMode = MachinePlaysBlack;
            DrawPosition(FALSE, boards[currentMove]);
         }
        return;
@@ -6511,8 +6558,8 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
        AskQuestion(realname, buf2, buf1, cps->pr);
        return;
     }
-    /* Commands from the engine directly to ICS.  We don't allow these to be 
-     *  sent until we are logged on. Crafty kibitzes have been known to 
+    /* Commands from the engine directly to ICS.  We don't allow these to be
+     *  sent until we are logged on. Crafty kibitzes have been known to
      *  interfere with the login process.
      */
     if (loggedOn) {
@@ -6546,7 +6593,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
      */
     if (strncmp(message + 1, "llegal move", 11) == 0 ||
        strncmp(message, "Error", 5) == 0) {
-       if (StrStr(message, "name") || 
+       if (StrStr(message, "name") ||
            StrStr(message, "rating") || StrStr(message, "?") ||
            StrStr(message, "result") || StrStr(message, "board") ||
            StrStr(message, "bk") || StrStr(message, "computer") ||
@@ -6659,7 +6706,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
           Don't use it. */
        cps->sendTime = 0;
     }
-    
+
     /*
      * If chess program startup fails, exit with an error message.
      * Attempts to recover here are futile.
@@ -6678,8 +6725,8 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
        DisplayFatalError(buf1, 0, 1);
        return;
     }
-    
-    /* 
+
+    /*
      * Look for hint output
      */
     if (sscanf(message, "Hint: %s", buf1) == 1) {
@@ -6753,7 +6800,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
                r = p + 1;
            }
        }
-            
+
         GameEnds(GameIsDrawn, r, GE_ENGINE1 + (cps != &first));
        return;
 
@@ -6878,7 +6925,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
        }
     }
 
-    
+
     /*
      * Look for thinking output
      */
@@ -6928,7 +6975,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
                }
 
                 /* [AS] Negate score if machine is playing black and reporting absolute scores */
-                if( cps->scoreIsAbsolute && 
+                if( cps->scoreIsAbsolute &&
                     ((gameMode == MachinePlaysBlack) || (gameMode == TwoMachinesPlay && cps->twoMachinesColor[0] == 'b')) )
                 {
                     curscore = -curscore;
@@ -6982,12 +7029,12 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
 
                 SendProgramStatsToFrontend( cps, &programStats );
 
-                /* 
+                /*
                     [AS] Protect the thinkOutput buffer from overflow... this
                     is only useful if buf1 hasn't overflowed first!
                 */
                sprintf(thinkOutput, "[%d]%c%+.2f %s%s",
-                       plylev, 
+                       plylev,
                        (gameMode == TwoMachinesPlay ?
                         ToUpper(cps->twoMachinesColor[0]) : ' '),
                        ((double) curscore) / 100.0,
@@ -7033,8 +7080,8 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
                programStats.line_is_book = 1;
 
                 SendProgramStatsToFrontend( cps, &programStats );
-                
-               if (currentMove == forwardMostMove || gameMode==AnalyzeMode || 
+
+               if (currentMove == forwardMostMove || gameMode==AnalyzeMode ||
                            gameMode == AnalyzeFile || appData.icsEngineAnalyze) {
                    DisplayMove(currentMove - 1);
                }
@@ -7104,7 +7151,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
            buf1[0] = NULLCHAR;
 
            if (sscanf(message, "%d%c %d %d " u64Display " %[^\n]\n",
-                      &plylev, &plyext, &curscore, &time, &nodes, buf1) >= 5) 
+                      &plylev, &plyext, &curscore, &time, &nodes, buf1) >= 5)
             {
                 ChessProgramStats cpstats;
 
@@ -7142,7 +7189,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
 
 /* Parse a game score from the character string "game", and
    record it as the history of the current game.  The game
-   score is NOT assumed to start from the standard position. 
+   score is NOT assumed to start from the standard position.
    The display is not updated in any way.
    */
 void
@@ -7318,7 +7365,7 @@ ParseGameHistory(game)
        strcpy(moveList[boardIndex], currentMoveString);
        strcat(moveList[boardIndex], "\n");
        boardIndex++;
-       ApplyMove(fromX, fromY, toX, toY, promoChar, boards[boardIndex], 
+       ApplyMove(fromX, fromY, toX, toY, promoChar, boards[boardIndex],
                                        castlingRights[boardIndex], &epStatus[boardIndex]);
         switch (MateTest(boards[boardIndex], PosFlags(boardIndex),
                                  EP_UNKNOWN, castlingRights[boardIndex]) ) {
@@ -7358,8 +7405,8 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board, castling, ep)
       oldEP = *ep;
       *ep = EP_NONE;
 
-      if( board[toY][toX] != EmptySquare ) 
-           *ep = EP_CAPTURE;  
+      if( board[toY][toX] != EmptySquare )
+           *ep = EP_CAPTURE;
 
       if( board[fromY][fromX] == WhitePawn ) {
            if(fromY != toY) // [HGM] Xiangqi sideway Pawn moves should not count as 50-move breakers
@@ -7369,26 +7416,26 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board, castling, ep)
                        gameInfo.variant != VariantBerolina || toX < fromX)
                      *ep = toX | berolina;
                if(toX<BOARD_RGHT-1 && board[toY][toX+1] == BlackPawn &&
-                       gameInfo.variant != VariantBerolina || toX > fromX) 
+                       gameInfo.variant != VariantBerolina || toX > fromX)
                      *ep = toX;
           }
-      } else 
+      } else
       if( board[fromY][fromX] == BlackPawn ) {
            if(fromY != toY) // [HGM] Xiangqi sideway Pawn moves should not count as 50-move breakers
-              *ep = EP_PAWN_MOVE; 
+              *ep = EP_PAWN_MOVE;
            if( toY-fromY== -2) {
                if(toX>BOARD_LEFT   && board[toY][toX-1] == WhitePawn &&
                        gameInfo.variant != VariantBerolina || toX < fromX)
                      *ep = toX | berolina;
                if(toX<BOARD_RGHT-1 && board[toY][toX+1] == WhitePawn &&
-                       gameInfo.variant != VariantBerolina || toX > fromX) 
+                       gameInfo.variant != VariantBerolina || toX > fromX)
                      *ep = toX;
           }
        }
 
        for(i=0; i<nrCastlingRights; i++) {
            if(castling[i] == fromX && castlingRank[i] == fromY ||
-              castling[i] == toX   && castlingRank[i] == toY   
+              castling[i] == toX   && castlingRank[i] == toY
              ) castling[i] = -1; // revoke for moved or captured piece
        }
 
@@ -7397,7 +7444,7 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board, castling, ep)
   /* [HGM] In Shatranj and Courier all promotions are to Ferz */
   if((gameInfo.variant==VariantShatranj || gameInfo.variant==VariantCourier)
        && promoChar != 0) promoChar = PieceToChar(WhiteFerz);
-         
+
   if (fromX == toX && fromY == toY) return;
 
   if (fromY == DROP_RANK) {
@@ -7586,7 +7633,7 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board, castling, ep)
       if (captured != EmptySquare && gameInfo.holdingsSize > 0
           && gameInfo.variant != VariantBughouse        ) {
         /* [HGM] holdings: Add to holdings, if holdings exist */
-       if(gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat) { 
+       if(gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat) {
                // [HGM] superchess: suppress flipping color of captured pieces by reverse pre-flip
                captured = (int) captured >= (int) BlackPawn ? BLACK_TO_WHITE captured : WHITE_TO_BLACK captured;
        }
@@ -7633,8 +7680,8 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board, castling, ep)
         board[toY][toX] = (ChessSquare) (PROMOTED piece);
     }
 
-    if((gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat) 
-               && promoChar != NULLCHAR && gameInfo.holdingsSize) { 
+    if((gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat)
+               && promoChar != NULLCHAR && gameInfo.holdingsSize) {
        // [HGM] superchess: take promotion piece out of holdings
        int k = PieceToNumber(CharToPiece(ToUpper(promoChar)));
        if((int)piece < (int)BlackPawn) { // determine stm from piece color
@@ -7663,10 +7710,10 @@ MakeMove(fromX, fromY, toX, toY, promoChar)
         if(gameInfo.variant == VariantKnightmate)
             king += (int) WhiteUnicorn - (int) WhiteKing;
         if(forwardMostMove == 0) {
-            if(blackPlaysFirst) 
+            if(blackPlaysFirst)
                 fprintf(serverMoves, "%s;", second.tidy);
             fprintf(serverMoves, "%s;", first.tidy);
-            if(!blackPlaysFirst) 
+            if(!blackPlaysFirst)
                 fprintf(serverMoves, "%s;", second.tidy);
         } else fprintf(serverMoves, loadFlag|lastLoadFlag ? ":" : ";");
         lastLoadFlag = loadFlag;
@@ -7709,7 +7756,7 @@ MakeMove(fromX, fromY, toX, toY, promoChar)
     }
     CopyBoard(boards[forwardMostMove+1], boards[forwardMostMove]);
     {int i; for(i=0; i<BOARD_SIZE; i++) castlingRights[forwardMostMove+1][i] = castlingRights[forwardMostMove][i];}
-    ApplyMove(fromX, fromY, toX, toY, promoChar, boards[forwardMostMove+1], 
+    ApplyMove(fromX, fromY, toX, toY, promoChar, boards[forwardMostMove+1],
                                castlingRights[forwardMostMove+1], &epStatus[forwardMostMove+1]);
     forwardMostMove++; // [HGM] bare: moved to after ApplyMove, to make sure clock interrupt finds complete board
     SwitchClocks(); // uses forwardMostMove, so must be done after incrementing it !
@@ -7754,17 +7801,24 @@ ShowMove(fromX, fromY, toX, toY)
 {
     int instant = (gameMode == PlayFromGameFile) ?
        (matchMode || (appData.timeDelay == 0 && !pausing)) : pausing;
+
     if(appData.noGUI) return;
-    if (!pausing || gameMode == PlayFromGameFile || gameMode == AnalyzeFile) {
-       if (!instant) {
-           if (forwardMostMove == currentMove + 1) {
-               AnimateMove(boards[forwardMostMove - 1],
-                           fromX, fromY, toX, toY);
-           }
-           if (appData.highlightLastMove) {
+
+    if (!pausing || gameMode == PlayFromGameFile || gameMode == AnalyzeFile)
+      {
+       if (!instant)
+         {
+           if (forwardMostMove == currentMove + 1)
+             {
+//TODO
+//             AnimateMove(boards[forwardMostMove - 1],
+//                         fromX, fromY, toX, toY);
+             }
+           if (appData.highlightLastMove)
+             {
                SetHighlights(fromX, fromY, toX, toY);
-           }
-       }
+             }
+         }
        currentMove = forwardMostMove;
     }
 
@@ -7774,6 +7828,8 @@ ShowMove(fromX, fromY, toX, toY)
     DrawPosition(FALSE, boards[currentMove]);
     DisplayBothClocks();
     HistorySet(parseList,backwardMostMove,forwardMostMove,currentMove-1);
+
+    return;
 }
 
 void SendEgtPath(ChessProgramState *cps)
@@ -7788,7 +7844,7 @@ void SendEgtPath(ChessProgramState *cps)
            name[0] = ','; // extract next format name from feature and copy with prefixed ','
            while(*p && *p != ',') *q++ = *p++;
            *q++ = ':'; *q = 0;
-           if( appData.defaultPathEGTB && appData.defaultPathEGTB[0] && 
+           if( appData.defaultPathEGTB && appData.defaultPathEGTB[0] &&
                strcmp(name, ",nalimov:") == 0 ) {
                // take nalimov path from the menu-changeable option first, if it is defined
                sprintf(buf, "egtpath nalimov %s\n", appData.defaultPathEGTB);
@@ -7853,7 +7909,7 @@ InitChessProgram(cps, setup)
            overruled = gameInfo.boardWidth != 9 || gameInfo.boardHeight != 9 || gameInfo.holdingsSize != 7;
       if( gameInfo.variant == VariantBughouse || gameInfo.variant == VariantCrazyhouse )
            overruled = gameInfo.boardWidth != 8 || gameInfo.boardHeight != 8 || gameInfo.holdingsSize != 5;
-      if( gameInfo.variant == VariantCapablanca || gameInfo.variant == VariantCapaRandom || 
+      if( gameInfo.variant == VariantCapablanca || gameInfo.variant == VariantCapaRandom ||
                                gameInfo.variant == VariantGothic  || gameInfo.variant == VariantFalcon )
            overruled = gameInfo.boardWidth != 10 || gameInfo.boardHeight != 8 || gameInfo.holdingsSize != 0;
       if( gameInfo.variant == VariantCourier )
@@ -7864,10 +7920,10 @@ InitChessProgram(cps, setup)
            overruled = gameInfo.boardWidth != 10 || gameInfo.boardHeight != 8 || gameInfo.holdingsSize != 8;
 
       if(overruled) {
-           sprintf(b, "%dx%d+%d_%s", gameInfo.boardWidth, gameInfo.boardHeight, 
+           sprintf(b, "%dx%d+%d_%s", gameInfo.boardWidth, gameInfo.boardHeight,
                                gameInfo.holdingsSize, VariantName(gameInfo.variant)); // cook up sized variant name
            /* [HGM] varsize: try first if this defiant size variant is specifically known */
-           if(StrStr(cps->variants, b) == NULL) { 
+           if(StrStr(cps->variants, b) == NULL) {
                // specific sized variant not known, check if general sizing allowed
                if (cps->protocolVersion != 1) { // for protocol 1 we cannot check and hope for the best
                    if(StrStr(cps->variants, "boardsize") == NULL) {
@@ -7904,7 +7960,7 @@ InitChessProgram(cps, setup)
                        timeIncrement, appData.searchDepth,
                        searchTime);
     }
-    if (appData.showThinking 
+    if (appData.showThinking
        // [HGM] thinking: four options require thinking output to be sent
        || !appData.hideThinkingFromHuman || appData.adjudicateLossThreshold != 0 || EngineOutputIsUp()
                                ) {
@@ -7923,7 +7979,7 @@ InitChessProgram(cps, setup)
       SendToProgram(buf, cps);
     }
     cps->initDone = TRUE;
-}   
+}
 
 
 void
@@ -7950,7 +8006,7 @@ StartChessProgram(cps)
        }
        err = StartChildProcess(buf, "", &cps->pr);
     }
-    
+
     if (err != 0) {
        sprintf(buf, _("Startup failure on '%s'"), cps->program);
        DisplayFatalError(buf, err, 1);
@@ -7958,7 +8014,7 @@ StartChessProgram(cps)
        cps->isr = NULL;
        return;
     }
-    
+
     cps->isr = AddInputSource(cps->pr, TRUE, ReceiveFromProgram, cps);
     if (cps->protocolVersion > 1) {
       sprintf(buf, "xboard\nprotover %d\n", cps->protocolVersion);
@@ -7998,7 +8054,7 @@ NextMatchGame P((void))
        if(index < 0) { // [HGM] autoinc
            lastIndex = index = (index == -2 && first.twoMachinesColor[0] == 'b') ? lastIndex : lastIndex+1;
            if(appData.rewindIndex > 0 && index > appData.rewindIndex) lastIndex = index = 1;
-       } 
+       }
        LoadGameFromFile(appData.loadGameFile,
                         index,
                         appData.loadGameFile, FALSE);
@@ -8007,7 +8063,7 @@ NextMatchGame P((void))
        if(index < 0) { // [HGM] autoinc
            lastIndex = index = (index == -2 && first.twoMachinesColor[0] == 'b') ? lastIndex : lastIndex+1;
            if(appData.rewindIndex > 0 && index > appData.rewindIndex) lastIndex = index = 1;
-       } 
+       }
        LoadPositionFromFile(appData.loadPositionFile,
                             index,
                             appData.loadPositionFile);
@@ -8074,8 +8130,8 @@ GameEnds(result, resultDetails, whosays)
 
     if (appData.icsActive && (whosays == GE_ENGINE || whosays >= GE_ENGINE1)) {
        /* If we are playing on ICS, the server decides when the
-          game is over, but the engine can offer to draw, claim 
-          a draw, or resign. 
+          game is over, but the engine can offer to draw, claim
+          a draw, or resign.
         */
 #if ZIPPY
        if (appData.zippyPlay && first.initDone) {
@@ -8104,17 +8160,17 @@ GameEnds(result, resultDetails, whosays)
 
     /* If this is an ICS game, only ICS can really say it's done;
        if not, anyone can. */
-    isIcsGame = (gameMode == IcsPlayingWhite || 
-                gameMode == IcsPlayingBlack || 
-                gameMode == IcsObserving    || 
+    isIcsGame = (gameMode == IcsPlayingWhite ||
+                gameMode == IcsPlayingBlack ||
+                gameMode == IcsObserving    ||
                 gameMode == IcsExamining);
 
     if (!isIcsGame || whosays == GE_ICS) {
        /* OK -- not an ICS game, or ICS said it was done */
        StopClocks();
-       if (!isIcsGame && !appData.noChessProgram) 
+       if (!isIcsGame && !appData.noChessProgram)
          SetUserThinkingEnables();
-    
+
         /* [HGM] if a machine claims the game end we verify this claim */
         if(gameMode == TwoMachinesPlay && appData.testClaims) {
            if(appData.testLegality && whosays >= GE_ENGINE1 ) {
@@ -8165,9 +8221,10 @@ GameEnds(result, resultDetails, whosays)
                 }
                 /* (Claiming a loss is accepted no questions asked!) */
            }
+
            /* [HGM] bare: don't allow bare King to win */
            if((gameInfo.holdingsWidth == 0 || gameInfo.variant == VariantSuper || gameInfo.variant == VariantGreat)
-              && gameInfo.variant != VariantLosers && gameInfo.variant != VariantGiveaway 
+              && gameInfo.variant != VariantLosers && gameInfo.variant != VariantGiveaway
               && gameInfo.variant != VariantSuicide // [HGM] losers: except in losers, of course...
               && result != GameIsDrawn)
            {   int i, j, k=0, color = (result==WhiteWins ? (int)WhitePawn : (int)BlackPawn);
@@ -8187,7 +8244,6 @@ GameEnds(result, resultDetails, whosays)
            }
         }
 
-
         if(serverMoves != NULL && !loadFlag) { char c = '=';
             if(result==WhiteWins) c = '+';
             if(result==BlackWins) c = '-';
@@ -8201,7 +8257,7 @@ GameEnds(result, resultDetails, whosays)
            /* display last move only if game was not loaded from file */
            if ((whosays != GE_FILE) && (currentMove == forwardMostMove))
                DisplayMove(currentMove - 1);
-    
+
            if (forwardMostMove != 0) {
                if (gameMode != PlayFromGameFile && gameMode != EditGame
                    && lastSavedGame != GameCheckSum() // [HGM] save: suppress duplicates
@@ -8282,8 +8338,8 @@ GameEnds(result, resultDetails, whosays)
                }
            }
        } else if (gameMode == EditGame ||
-                  gameMode == PlayFromGameFile || 
-                  gameMode == AnalyzeMode || 
+                  gameMode == PlayFromGameFile ||
+                  gameMode == AnalyzeMode ||
                   gameMode == AnalyzeFile) {
            nextGameMode = gameMode;
        } else {
@@ -8323,7 +8379,7 @@ GameEnds(result, resultDetails, whosays)
        if (first.isr != NULL)
          RemoveInputSource(first.isr);
        first.isr = NULL;
-    
+
        if (first.pr != NoProc) {
            ExitAnalyzeMode();
             DoSleep( appData.delayBeforeQuit );
@@ -8349,7 +8405,7 @@ GameEnds(result, resultDetails, whosays)
        if (second.isr != NULL)
          RemoveInputSource(second.isr);
        second.isr = NULL;
-    
+
        if (second.pr != NoProc) {
             DoSleep( appData.delayBeforeQuit );
            SendToProgram("quit\n", &second);
@@ -8413,12 +8469,12 @@ GameEnds(result, resultDetails, whosays)
 /* Assumes program was just initialized (initString sent).
    Leaves program in force mode. */
 void
-FeedMovesToProgram(cps, upto) 
+FeedMovesToProgram(cps, upto)
      ChessProgramState *cps;
      int upto;
 {
     int i;
-    
+
     if (appData.debugMode)
       fprintf(debugFP, "Feeding %smoves %d through %d to %s chess program\n",
              startedFromSetupPosition ? "position and " : "",
@@ -8451,7 +8507,7 @@ ResurrectChessProgram()
        If so, restart it and feed it all the moves made so far. */
 
     if (appData.noChessProgram || first.pr != NoProc) return;
-    
+
     StartChessProgram(&first);
     InitChessProgram(&first, FALSE);
     FeedMovesToProgram(&first, currentMove);
@@ -8504,7 +8560,7 @@ Reset(redraw, init)
     white_holding[0] = black_holding[0] = NULLCHAR;
     ClearProgramStats();
     opponentKibitzes = FALSE; // [HGM] kibitz: do not reserve space in engine-output window in zippy mode
-    
+
     ResetFrontEnd();
     ClearHighlights();
     flipView = appData.flipView;
@@ -8529,6 +8585,7 @@ Reset(redraw, init)
     ExitAnalyzeMode();
     gameMode = BeginningOfGame;
     ModeHighlight();
+
     if(appData.icsActive) gameInfo.variant = VariantNormal;
     currentMove = forwardMostMove = backwardMostMove = 0;
     InitPosition(redraw);
@@ -8538,6 +8595,7 @@ Reset(redraw, init)
            commentList[i] = NULL;
        }
     }
+
     ResetClocks();
     timeRemaining[0][0] = whiteTimeRemaining;
     timeRemaining[1][0] = blackTimeRemaining;
@@ -8547,10 +8605,12 @@ Reset(redraw, init)
     if (init) {
            InitChessProgram(&first, startedFromSetupPosition);
     }
+
     DisplayTitle("");
     DisplayMessage("", "");
     HistorySet(parseList, backwardMostMove, forwardMostMove, currentMove-1);
     lastSavedGame = 0; // [HGM] save: make sure next game counts as unsaved
+    return;
 }
 
 void
@@ -8590,7 +8650,7 @@ AutoPlayOneMove()
 
       return FALSE;
     }
-    
+
     toX = moveList[currentMove][2] - AAA;
     toY = moveList[currentMove][3] - ONE;
 
@@ -8629,13 +8689,13 @@ LoadGameOneMove(readAhead)
     ChessMove moveType;
     char move[MSG_SIZ];
     char *p, *q;
-    
-    if (gameMode != PlayFromGameFile && gameMode != AnalyzeFile && 
+
+    if (gameMode != PlayFromGameFile && gameMode != AnalyzeFile &&
        gameMode != AnalyzeMode && gameMode != Training) {
        gameFileFP = NULL;
        return FALSE;
     }
-    
+
     yyboardindex = forwardMostMove;
     if (readAhead != (ChessMove)0) {
       moveType = readAhead;
@@ -8644,11 +8704,11 @@ LoadGameOneMove(readAhead)
          return FALSE;
       moveType = (ChessMove) yylex();
     }
-    
+
     done = FALSE;
     switch (moveType) {
       case Comment:
-       if (appData.debugMode) 
+       if (appData.debugMode)
          fprintf(debugFP, "Parsed Comment: %s\n", yy_text);
        p = yy_text;
        if (*p == '{' || *p == '[' || *p == '(') {
@@ -8867,7 +8927,7 @@ LoadGameOneMove(readAhead)
        /* currentMoveString is set as a side-effect of yylex */
        strcat(currentMoveString, "\n");
        strcpy(moveList[forwardMostMove], currentMoveString);
-       
+
        thinkOutput[0] = NULLCHAR;
        MakeMove(fromX, fromY, toX, toY, promoChar);
        currentMove = forwardMostMove;
@@ -8907,7 +8967,8 @@ LoadGameFromFile(filename, n, title, useList)
            DisplayError(_("Cannot build game list"), error);
        } else if (!ListEmpty(&gameList) &&
                   ((ListGame *) gameList.tailPred)->number > 1) {
-           GameListPopUp(f, title);
+         // TODO convert to GTK
+         //        GameListPopUp(f, title);
            return TRUE;
        }
        GameListDestroy();
@@ -8930,7 +8991,7 @@ MakeRegisteredMove()
            if (appData.debugMode)
              fprintf(debugFP, "Restoring %s for game %d\n",
                      cmailMove[lastLoadGameNumber - 1], lastLoadGameNumber);
-    
+
            thinkOutput[0] = NULLCHAR;
            strcpy(moveList[currentMove], cmailMove[lastLoadGameNumber - 1]);
             fromX = cmailMove[lastLoadGameNumber - 1][0] - AAA;
@@ -8940,13 +9001,13 @@ MakeRegisteredMove()
            promoChar = cmailMove[lastLoadGameNumber - 1][4];
            MakeMove(fromX, fromY, toX, toY, promoChar);
            ShowMove(fromX, fromY, toX, toY);
-             
+
            switch (MateTest(boards[currentMove], PosFlags(currentMove),
                              EP_UNKNOWN, castlingRights[currentMove]) ) {
              case MT_NONE:
              case MT_CHECK:
                break;
-               
+
              case MT_CHECKMATE:
              case MT_STAINMATE:
                if (WhiteOnMove(currentMove)) {
@@ -8955,14 +9016,14 @@ MakeRegisteredMove()
                    GameEnds(WhiteWins, "White mates", GE_PLAYER);
                }
                break;
-               
+
              case MT_STALEMATE:
                GameEnds(GameIsDrawn, "Stalemate", GE_PLAYER);
                break;
            }
 
            break;
-           
+
          case CMAIL_RESIGN:
            if (WhiteOnMove(currentMove)) {
                GameEnds(BlackWins, "White resigns", GE_PLAYER);
@@ -8970,11 +9031,11 @@ MakeRegisteredMove()
                GameEnds(WhiteWins, "Black resigns", GE_PLAYER);
            }
            break;
-           
+
          case CMAIL_ACCEPT:
            GameEnds(GameIsDrawn, "Draw agreed", GE_PLAYER);
            break;
-             
+
          default:
            break;
        }
@@ -9070,71 +9131,90 @@ LoadGame(f, gameNumber, title, useList)
     GameMode oldGameMode;
     VariantClass oldVariant = gameInfo.variant; /* [HGM] PGNvariant */
 
-    if (appData.debugMode) 
+    if (appData.debugMode)
        fprintf(debugFP, "LoadGame(): on entry, gameMode %d\n", gameMode);
 
     if (gameMode == Training )
        SetTrainingModeOff();
 
     oldGameMode = gameMode;
-    if (gameMode != BeginningOfGame) {
-      Reset(FALSE, TRUE);
-    }
+    if (gameMode != BeginningOfGame) 
+      {
+       Reset(FALSE, TRUE);
+      };
 
     gameFileFP = f;
-    if (lastLoadGameFP != NULL && lastLoadGameFP != f) {
+    if (lastLoadGameFP != NULL && lastLoadGameFP != f) 
+      {
        fclose(lastLoadGameFP);
-    }
+      };
 
-    if (useList) {
+    if (useList) 
+      {
        lg = (ListGame *) ListElem(&gameList, gameNumber-1);
        
-       if (lg) {
+       if (lg) 
+         {
            fseek(f, lg->offset, 0);
            GameListHighlight(gameNumber);
            gn = 1;
-       }
-       else {
+         }
+       else 
+         {
            DisplayError(_("Game number out of range"), 0);
            return FALSE;
-       }
-    } else {
+         };
+      } 
+    else 
+      {
        GameListDestroy();
-       if (fseek(f, 0, 0) == -1) {
+       if (fseek(f, 0, 0) == -1) 
+         {
            if (f == lastLoadGameFP ?
                gameNumber == lastLoadGameNumber + 1 :
-               gameNumber == 1) {
+               gameNumber == 1) 
+             {
                gn = 1;
-           } else {
+             } 
+           else 
+             {
                DisplayError(_("Can't seek on game file"), 0);
                return FALSE;
-           }
-       }
-    }
-    lastLoadGameFP = f;
-    lastLoadGameNumber = gameNumber;
+             };
+         };
+      };
+
+    lastLoadGameFP     = f;
+    lastLoadGameNumber = gameNumber;
     strcpy(lastLoadGameTitle, title);
     lastLoadGameUseList = useList;
 
     yynewfile(f);
 
-    if (lg && lg->gameInfo.white && lg->gameInfo.black) {
-      snprintf(buf, sizeof(buf), "%s vs. %s", lg->gameInfo.white,
-               lg->gameInfo.black);
-           DisplayTitle(buf);
-    } else if (*title != NULLCHAR) {
-       if (gameNumber > 1) {
+    if (lg && lg->gameInfo.white && lg->gameInfo.black) 
+      {
+       snprintf(buf, sizeof(buf), "%s vs. %s", lg->gameInfo.white,
+                lg->gameInfo.black);
+       DisplayTitle(buf);
+      } 
+    else if (*title != NULLCHAR) 
+      {
+       if (gameNumber > 1) 
+         {
            sprintf(buf, "%s %d", title, gameNumber);
            DisplayTitle(buf);
-       } else {
+         } 
+       else 
+         {
            DisplayTitle(title);
-       }
-    }
+         };
+      };
 
-    if (gameMode != AnalyzeFile && gameMode != AnalyzeMode) {
+    if (gameMode != AnalyzeFile && gameMode != AnalyzeMode) 
+      {
        gameMode = PlayFromGameFile;
        ModeHighlight();
-    }
+      };
 
     currentMove = forwardMostMove = backwardMostMove = 0;
     CopyBoard(boards[0], initialPosition);
@@ -9142,12 +9222,12 @@ LoadGame(f, gameNumber, title, useList)
 
     /*
      * Skip the first gn-1 games in the file.
-     * Also skip over anything that precedes an identifiable 
-     * start of game marker, to avoid being confused by 
-     * garbage at the start of the file.  Currently 
+     * Also skip over anything that precedes an identifiable
+     * start of game marker, to avoid being confused by
+     * garbage at the start of the file.  Currently
      * recognized start of game markers are the move number "1",
      * the pattern "gnuchess .* game", the pattern
-     * "^[#;%] [^ ]* game file", and a PGN tag block.  
+     * "^[#;%] [^ ]* game file", and a PGN tag block.
      * A game that starts with one of the latter two patterns
      * will also have a move number 1, possibly
      * following a position diagram.
@@ -9173,7 +9253,7 @@ LoadGame(f, gameNumber, title, useList)
            gn--;
            lastLoadGameStart = cm;
            break;
-           
+
          case MoveNumberOne:
            switch (lastLoadGameStart) {
              case GNUChessGame:
@@ -9241,7 +9321,7 @@ LoadGame(f, gameNumber, title, useList)
            break;
        }
     }
-    
+
     if (appData.debugMode)
       fprintf(debugFP, "Parsed game start '%s' (%d)\n", yy_text, (int) cm);
 
@@ -9267,11 +9347,11 @@ LoadGame(f, gameNumber, title, useList)
            free(gameInfo.event);
        }
        gameInfo.event = StrSave(yy_text);
-    }  
+    }
 
     startedFromSetupPosition = FALSE;
     while (cm == PGNTag) {
-       if (appData.debugMode) 
+       if (appData.debugMode)
          fprintf(debugFP, "Parsed PGNTag: %s\n", yy_text);
        err = ParsePGNTag(yy_text, &gameInfo);
        if (!err) numPGNTags++;
@@ -9281,7 +9361,7 @@ LoadGame(f, gameNumber, title, useList)
             startedFromPositionFile = FALSE; /* [HGM] loadPos: variant switch likely makes position invalid */
            InitPosition(TRUE);
             oldVariant = gameInfo.variant;
-           if (appData.debugMode) 
+           if (appData.debugMode)
              fprintf(debugFP, "New variant %d\n", (int) oldVariant);
         }
 
@@ -9327,7 +9407,7 @@ LoadGame(f, gameNumber, title, useList)
        /* Handle comments interspersed among the tags */
        while (cm == Comment) {
            char *p;
-           if (appData.debugMode) 
+           if (appData.debugMode)
              fprintf(debugFP, "Parsed Comment: %s\n", yy_text);
            p = yy_text;
            if (*p == '{' || *p == '[' || *p == '(') {
@@ -9388,13 +9468,13 @@ LoadGame(f, gameNumber, title, useList)
                }
            while (*p == ' ' || *p == '\t' ||
                   *p == '\n' || *p == '\r') p++;
-       
+
            if (strncmp(p, "black", strlen("black"))==0)
              blackPlaysFirst = TRUE;
            else
              blackPlaysFirst = FALSE;
            startedFromSetupPosition = TRUE;
-       
+
            CopyBoard(boards[0], initial_position);
            if (blackPlaysFirst) {
                currentMove = forwardMostMove = backwardMostMove = 1;
@@ -9426,14 +9506,14 @@ LoadGame(f, gameNumber, title, useList)
         fprintf(debugFP, "Load Game\n");
     }
        DisplayBothClocks();
-    }      
+    }
 
     /* [HGM] server: flag to write setup moves in broadcast file as one */
     loadFlag = appData.suppressLoadMoves;
 
     while (cm == Comment) {
        char *p;
-       if (appData.debugMode) 
+       if (appData.debugMode)
          fprintf(debugFP, "Parsed Comment: %s\n", yy_text);
        p = yy_text;
        if (*p == '{' || *p == '[' || *p == '(') {
@@ -9469,7 +9549,7 @@ LoadGame(f, gameNumber, title, useList)
     if (!matchMode && (pausing || appData.timeDelay != 0)) {
        DisplayComment(currentMove - 1, commentList[currentMove]);
     }
-    if (!matchMode && appData.timeDelay != 0) 
+    if (!matchMode && appData.timeDelay != 0)
       DrawPosition(FALSE, boards[currentMove]);
 
     if (gameMode == AnalyzeFile || gameMode == AnalyzeMode) {
@@ -9477,7 +9557,7 @@ LoadGame(f, gameNumber, title, useList)
     }
 
     /* if the first token after the PGN tags is a move
-     * and not move number 1, retrieve it from the parser 
+     * and not move number 1, retrieve it from the parser
      */
     if (cm != MoveNumberOne)
        LoadGameOneMove(cm);
@@ -9506,7 +9586,7 @@ LoadGame(f, gameNumber, title, useList)
       AutoPlayGameLoop();
     }
 
-    if (appData.debugMode) 
+    if (appData.debugMode)
        fprintf(debugFP, "LoadGame(): on exit, gameMode %d\n", gameMode);
 
     loadFlag = 0; /* [HGM] true game starts */
@@ -9565,7 +9645,7 @@ LoadPosition(f, positionNumber, title)
     char *p, line[MSG_SIZ];
     Board initial_position;
     int i, j, fenMode, pn;
-    
+
     if (gameMode == Training )
        SetTrainingModeOff();
 
@@ -9582,7 +9662,7 @@ LoadPosition(f, positionNumber, title)
     if (first.pr == NoProc) {
       StartChessProgram(&first);
       InitChessProgram(&first, FALSE);
-    }    
+    }
     pn = positionNumber;
     if (positionNumber < 0) {
        /* Negative position number means to seek to that byte offset */
@@ -9632,7 +9712,7 @@ LoadPosition(f, positionNumber, title)
     } else {
        (void) fgets(line, MSG_SIZ, f);
        (void) fgets(line, MSG_SIZ, f);
-    
+
         for (i = BOARD_HEIGHT - 1; i >= 0; i--) {
            (void) fgets(line, MSG_SIZ, f);
             for (p = line, j = BOARD_LEFT; j < BOARD_RGHT; p++) {
@@ -9641,7 +9721,7 @@ LoadPosition(f, positionNumber, title)
                initial_position[i][j++] = CharToPiece(*p);
            }
        }
-    
+
        blackPlaysFirst = FALSE;
        if (!feof(f)) {
            (void) fgets(line, MSG_SIZ, f);
@@ -9650,7 +9730,7 @@ LoadPosition(f, positionNumber, title)
        }
     }
     startedFromSetupPosition = TRUE;
-    
+
     SendToProgram("force\n", &first);
     CopyBoard(boards[0], initial_position);
     if (blackPlaysFirst) {
@@ -9690,7 +9770,7 @@ int i, j;
     timeRemaining[0][1] = whiteTimeRemaining;
     timeRemaining[1][1] = blackTimeRemaining;
     DrawPosition(FALSE, boards[currentMove]);
-   
+
     return TRUE;
 }
 
@@ -9757,7 +9837,7 @@ SavePart(str)
 {
     static char buf[MSG_SIZ];
     char *p;
-    
+
     p = strchr(str, ' ');
     if (p == NULL) return str;
     strncpy(buf, str, p - str);
@@ -9836,7 +9916,7 @@ void GetOutOfBookInfo( char * buf )
                 }
 
                 sprintf( buf+strlen(buf), "%d%s. ", (idx - offset)/2 + 1, idx & 1 ? ".." : "" );
-                sprintf( buf+strlen(buf), "%s%.2f", 
+                sprintf( buf+strlen(buf), "%s%.2f",
                     pvInfoList[idx].score >= 0 ? "+" : "",
                     pvInfoList[idx].score / 100.0 );
             }
@@ -9857,11 +9937,11 @@ SaveGamePGN(f)
     char move_buffer[100]; /* [AS] Buffer for move+PV info */
 
     offset = backwardMostMove & (~1L); /* output move numbers start at 1 */
-    
+
     tm = time((time_t *) NULL);
-    
+
     PrintPGNTags(f, &gameInfo);
-    
+
     if (backwardMostMove > 0 || startedFromSetupPosition) {
         char *fen = PositionToFEN(backwardMostMove, NULL);
         fprintf(f, "[FEN \"%s\"]\n[SetUp \"1\"]\n", fen);
@@ -9878,7 +9958,7 @@ SaveGamePGN(f)
             GetOutOfBookInfo( buf );
 
             if( buf[0] != '\0' ) {
-                fprintf( f, "[%s \"%s\"]\n", PGN_OUT_OF_BOOK, buf ); 
+                fprintf( f, "[%s \"%s\"]\n", PGN_OUT_OF_BOOK, buf );
             }
         }
 
@@ -9965,7 +10045,7 @@ SaveGamePGN(f)
                                   sprintf(buf, " %d:%02d%c", seconds/60, seconds%60, 0);
            }
 
-            sprintf( move_buffer, "{%s%.2f/%d%s}", 
+            sprintf( move_buffer, "{%s%.2f/%d%s}",
                 pvInfoList[i].score >= 0 ? "+" : "",
                 pvInfoList[i].score / 100.0,
                 pvInfoList[i].depth,
@@ -9990,7 +10070,7 @@ SaveGamePGN(f)
 
        i++;
     }
-    
+
     /* Start a new line */
     if (linelen > 0) fprintf(f, "\n");
 
@@ -10020,12 +10100,12 @@ SaveGameOldStyle(f)
 {
     int i, offset;
     time_t tm;
-    
+
     tm = time((time_t *) NULL);
-    
+
     fprintf(f, "# %s game file -- %s", programName, ctime(&tm));
     PrintOpponents(f);
-    
+
     if (backwardMostMove > 0 || startedFromSetupPosition) {
        fprintf(f, "\n[--------------\n");
        PrintPosition(f, backwardMostMove);
@@ -10060,7 +10140,7 @@ SaveGameOldStyle(f)
            i++;
        }
     }
-    
+
     if (commentList[i] != NULL) {
        fprintf(f, "[%s]\n", commentList[i]);
     }
@@ -10125,10 +10205,10 @@ SavePosition(f, dummy, dummy2)
 {
     time_t tm;
     char *fen;
-    
+
     if (appData.oldSaveStyle) {
        tm = time((time_t *) NULL);
-    
+
        fprintf(f, "# %s position file -- %s", programName, ctime(&tm));
        PrintOpponents(f);
        fprintf(f, "[--------------\n");
@@ -10153,7 +10233,7 @@ ReloadCmailMsgEvent(unregister)
     int i;
     struct stat inbuf, outbuf;
     int status;
-    
+
     /* Any registered moves are unregistered if unregister is set, */
     /* i.e. invoked by the signal handler */
     if (unregister) {
@@ -10181,7 +10261,7 @@ ReloadCmailMsgEvent(unregister)
        outFilename = (char *) malloc(strlen(appData.cmailGameName) + 5);
        sprintf(outFilename, "%s.out", appData.cmailGameName);
     }
-    
+
     status = stat(outFilename, &outbuf);
     if (status < 0) {
        cmailMailedMove = FALSE;
@@ -10189,10 +10269,10 @@ ReloadCmailMsgEvent(unregister)
        status = stat(inFilename, &inbuf);
        cmailMailedMove = (inbuf.st_mtime < outbuf.st_mtime);
     }
-    
+
     /* LoadGameFromFile(CMAIL_MAX_GAMES) with cmailMsgLoaded == TRUE
        counts the games, notes how each one terminated, etc.
-       
+
        It would be nice to remove this kludge and instead gather all
        the information while building the game list.  (And to keep it
        in the game list nodes instead of having a bunch of fixed-size
@@ -10202,7 +10282,7 @@ ReloadCmailMsgEvent(unregister)
        */
     cmailMsgLoaded = TRUE;
     LoadGameFromFile(inFilename, CMAIL_MAX_GAMES, "", FALSE);
-    
+
     /* Load first game in the file or popup game menu */
     LoadGameFromFile(inFilename, 0, appData.cmailGameName, TRUE);
 
@@ -10228,7 +10308,7 @@ RegisterMove()
        cmailMoveRegistered[lastLoadGameNumber - 1] = FALSE;
        nCmailMovesRegistered --;
 
-       if (cmailCommentList[lastLoadGameNumber - 1] != NULL) 
+       if (cmailCommentList[lastLoadGameNumber - 1] != NULL)
          {
              free(cmailCommentList[lastLoadGameNumber - 1]);
              cmailCommentList[lastLoadGameNumber - 1] = NULL;
@@ -10275,11 +10355,11 @@ RegisterMove()
 
        sprintf(string,
                "%s.game.out.%d", appData.cmailGameName, lastLoadGameNumber);
-       
+
        f = fopen(string, "w");
        if (appData.oldSaveStyle) {
            SaveGameOldStyle(f); /* also closes the file */
-           
+
            sprintf(string, "%s.pos.out", appData.cmailGameName);
            f = fopen(string, "w");
            SavePosition(f, 0, NULL); /* also closes the file */
@@ -10287,10 +10367,10 @@ RegisterMove()
            fprintf(f, "{--------------\n");
            PrintPosition(f, currentMove);
            fprintf(f, "--------------}\n\n");
-           
+
            SaveGame(f, 0, NULL); /* also closes the file*/
        }
-       
+
        cmailMoveRegistered[lastLoadGameNumber - 1] = TRUE;
        nCmailMovesRegistered ++;
     } else if (nCmailGames == 1) {
@@ -10333,7 +10413,7 @@ MailMoveEvent()
 #endif
 
     if (! (cmailMailedMove || RegisterMove())) return;
-    
+
     if (   cmailMailedMove
        || (nCmailMovesRegistered + nCmailResults == nCmailGames)) {
        sprintf(string, partCommandString,
@@ -10399,7 +10479,7 @@ CmailMsg()
     char number[5];
     char string[MSG_SIZ];      /* Space for game-list */
     int  i;
-    
+
     if (!cmailMsgLoaded) return "";
 
     if (cmailMailedMove) {
@@ -10416,7 +10496,7 @@ CmailMsg()
                    sprintf(number, "%d", i + 1);
                    prependComma = 1;
                }
-               
+
                strcat(string, number);
            }
        }
@@ -10428,12 +10508,12 @@ CmailMsg()
                sprintf(cmailMsg,
                        _("Still need to make move for game\n"));
                break;
-               
+
              case 2:
                sprintf(cmailMsg,
                        _("Still need to make moves for both games\n"));
                break;
-               
+
              default:
                sprintf(cmailMsg,
                        _("Still need to make moves for all %d games\n"),
@@ -10447,7 +10527,7 @@ CmailMsg()
                        _("Still need to make a move for game %s\n"),
                        string);
                break;
-               
+
              case 0:
                if (nCmailResults == nCmailGames) {
                    sprintf(cmailMsg, _("No unfinished games\n"));
@@ -10455,7 +10535,7 @@ CmailMsg()
                    sprintf(cmailMsg, _("Ready to send mail\n"));
                }
                break;
-               
+
              default:
                sprintf(cmailMsg,
                        _("Still need to make moves for games %s\n"),
@@ -10518,7 +10598,7 @@ ExitEvent(status)
     /* Kill off chess programs */
     if (first.pr != NoProc) {
        ExitAnalyzeMode();
-        
+
         DoSleep( appData.delayBeforeQuit );
        SendToProgram("quit\n", &first);
         DoSleep( appData.delayAfterQuit );
@@ -10556,7 +10636,7 @@ PauseEvent()
            DisplayBothClocks();
        }
        if (gameMode == PlayFromGameFile) {
-           if (appData.timeDelay >= 0) 
+           if (appData.timeDelay >= 0)
                AutoPlayGameLoop();
        } else if (gameMode == IcsExamining && pauseExamInvalid) {
            Reset(FALSE, TRUE);
@@ -10695,25 +10775,25 @@ MachineWhiteEvent()
       return;
 
 
-    if (gameMode == PlayFromGameFile || 
-       gameMode == TwoMachinesPlay  || 
-       gameMode == Training         || 
-       gameMode == AnalyzeMode      || 
+    if (gameMode == PlayFromGameFile ||
+       gameMode == TwoMachinesPlay  ||
+       gameMode == Training         ||
+       gameMode == AnalyzeMode      ||
        gameMode == EndOfGame)
        EditGameEvent();
 
-    if (gameMode == EditPosition) 
+    if (gameMode == EditPosition)
         EditPositionDone();
 
     if (!WhiteOnMove(currentMove)) {
        DisplayError(_("It is not White's turn"), 0);
        return;
     }
-  
+
     if (gameMode == AnalyzeMode || gameMode == AnalyzeFile)
       ExitAnalyzeMode();
 
-    if (gameMode == EditGame || gameMode == AnalyzeMode || 
+    if (gameMode == EditGame || gameMode == AnalyzeMode ||
        gameMode == AnalyzeFile)
        TruncateGame();
 
@@ -10756,7 +10836,7 @@ MachineWhiteEvent()
     if(bookHit) { // [HGM] book: simulate book reply
        static char bookMove[MSG_SIZ]; // a bit generous?
 
-       programStats.nodes = programStats.depth = programStats.time = 
+       programStats.nodes = programStats.depth = programStats.time =
        programStats.score = programStats.got_only_move = 0;
        sprintf(programStats.movelist, "%s (xbook)", bookHit);
 
@@ -10776,25 +10856,25 @@ MachineBlackEvent()
        return;
 
 
-    if (gameMode == PlayFromGameFile || 
-       gameMode == TwoMachinesPlay  || 
-       gameMode == Training         || 
-       gameMode == AnalyzeMode      || 
+    if (gameMode == PlayFromGameFile ||
+       gameMode == TwoMachinesPlay  ||
+       gameMode == Training         ||
+       gameMode == AnalyzeMode      ||
        gameMode == EndOfGame)
         EditGameEvent();
 
-    if (gameMode == EditPosition) 
+    if (gameMode == EditPosition)
         EditPositionDone();
 
     if (WhiteOnMove(currentMove)) {
        DisplayError(_("It is not Black's turn"), 0);
        return;
     }
-    
+
     if (gameMode == AnalyzeMode || gameMode == AnalyzeFile)
       ExitAnalyzeMode();
 
-    if (gameMode == EditGame || gameMode == AnalyzeMode || 
+    if (gameMode == EditGame || gameMode == AnalyzeMode ||
        gameMode == AnalyzeFile)
        TruncateGame();
 
@@ -10831,7 +10911,7 @@ MachineBlackEvent()
     if(bookHit) { // [HGM] book: simulate book reply
        static char bookMove[MSG_SIZ]; // a bit generous?
 
-       programStats.nodes = programStats.depth = programStats.time = 
+       programStats.nodes = programStats.depth = programStats.time =
        programStats.score = programStats.got_only_move = 0;
        sprintf(programStats.movelist, "%s (xbook)", bookHit);
 
@@ -10871,7 +10951,7 @@ TwoMachinesEvent P((void))
     char buf[MSG_SIZ];
     ChessProgramState *onmove;
     char *bookHit = NULL;
-    
+
     if (appData.noChessProgram) return;
 
     switch (gameMode) {
@@ -10977,7 +11057,7 @@ TwoMachinesEvent P((void))
     if(bookHit) { // [HGM] book: simulate book reply
        static char bookMove[MSG_SIZ]; // a bit generous?
 
-       programStats.nodes = programStats.depth = programStats.time = 
+       programStats.nodes = programStats.depth = programStats.time =
        programStats.score = programStats.got_only_move = 0;
        sprintf(programStats.movelist, "%s (xbook)", bookHit);
 
@@ -11036,7 +11116,7 @@ IcsClientEvent()
       case AnalyzeFile:
        ExitAnalyzeMode();
        break;
-       
+
       default:
        EditGameEvent();
        break;
@@ -11101,7 +11181,7 @@ EditGameEvent()
       default:
        return;
     }
-    
+
     pausing = FALSE;
     StopClocks();
     first.offeredDraw = second.offeredDraw = 0;
@@ -11128,8 +11208,8 @@ EditGameEvent()
            whiteFlag = blackFlag = 0;
        }
        DisplayTitle("");
-    }          
-    
+    }
+
     gameMode = EditGame;
     ModeHighlight();
     SetGameInfo();
@@ -11143,16 +11223,16 @@ EditPositionEvent()
        EditGameEvent();
        return;
     }
-    
+
     EditGameEvent();
     if (gameMode != EditGame) return;
-    
+
     gameMode = EditPosition;
     ModeHighlight();
     SetGameInfo();
     if (currentMove > 0)
       CopyBoard(boards[0], boards[currentMove]);
-    
+
     blackPlaysFirst = !WhiteOnMove(currentMove);
     ResetClocks();
     currentMove = forwardMostMove = backwardMostMove = 0;
@@ -11244,7 +11324,7 @@ SendMultiLineToICS(buf)
     len = strlen(buf);
     if (len > MSG_SIZ)
       len = MSG_SIZ;
-  
+
     strncpy(temp, buf, len);
     temp[len] = 0;
 
@@ -11356,7 +11436,7 @@ EditPositionMenuEvent(selection, x, y)
            piece > (int)BlackMan && piece <= (int)BlackKing   ) {
             selection = (ChessSquare) (DEMOTED piece);
         } else if(piece == EmptySquare) selection = BlackSilver;
-        else selection = (ChessSquare)((int)piece + 1);       
+        else selection = (ChessSquare)((int)piece + 1);
         goto defaultlabel;
 
       case WhiteQueen:
@@ -11435,7 +11515,7 @@ void
 AcceptEvent()
 {
     /* Accept a pending offer of any kind from opponent */
-    
+
     if (appData.icsActive) {
         SendToICS(ics_prefix);
        SendToICS("accept\n");
@@ -11460,7 +11540,7 @@ void
 DeclineEvent()
 {
     /* Decline a pending offer of any kind from opponent */
-    
+
     if (appData.icsActive) {
         SendToICS(ics_prefix);
        SendToICS("decline\n");
@@ -11532,14 +11612,14 @@ void
 DrawEvent()
 {
     /* Offer draw or accept pending draw offer from opponent */
-    
+
     if (appData.icsActive) {
        /* Note: tournament rules require draw offers to be
           made after you make your move but before you punch
           your clock.  Currently ICS doesn't let you do that;
           instead, you immediately punch your clock after making
           a move, but you can offer a draw at any time. */
-       
+
         SendToICS(ics_prefix);
        SendToICS("draw\n");
     } else if (cmailMsgLoaded) {
@@ -11573,7 +11653,7 @@ void
 AdjournEvent()
 {
     /* Offer Adjourn or accept pending Adjourn offer from opponent */
-    
+
     if (appData.icsActive) {
         SendToICS(ics_prefix);
        SendToICS("adjourn\n");
@@ -11587,7 +11667,7 @@ void
 AbortEvent()
 {
     /* Offer Abort or accept pending Abort offer from opponent */
-    
+
     if (appData.icsActive) {
         SendToICS(ics_prefix);
        SendToICS("abort\n");
@@ -11600,7 +11680,7 @@ void
 ResignEvent()
 {
     /* Resign.  You can do this even if it's not your turn. */
-    
+
     if (appData.icsActive) {
         SendToICS(ics_prefix);
        SendToICS("resign\n");
@@ -11661,12 +11741,12 @@ ForwardInner(target)
 
     if (gameMode == PlayFromGameFile && !pausing)
       PauseEvent();
-    
+
     if (gameMode == IcsExamining && pausing)
       limit = pauseExamForwardMostMove;
     else
       limit = forwardMostMove;
-    
+
     if (target > limit) target = limit;
 
     if (target > 0 && moveList[target - 1][0]) {
@@ -11688,8 +11768,8 @@ ForwardInner(target)
            }
        }
     }
-    if (gameMode == EditGame || gameMode == AnalyzeMode || 
-       gameMode == Training || gameMode == PlayFromGameFile || 
+    if (gameMode == EditGame || gameMode == AnalyzeMode ||
+       gameMode == Training || gameMode == PlayFromGameFile ||
        gameMode == AnalyzeFile) {
        while (currentMove < target) {
            SendMoveToProgram(currentMove++, &first);
@@ -11697,7 +11777,7 @@ ForwardInner(target)
     } else {
        currentMove = target;
     }
-    
+
     if (gameMode == EditGame || gameMode == EndOfGame) {
        whiteTimeRemaining = timeRemaining[0][currentMove];
        blackTimeRemaining = timeRemaining[1][currentMove];
@@ -11730,13 +11810,13 @@ ToEndEvent()
        /* to optimze, we temporarily turn off analysis mode while we feed
         * the remaining moves to the engine. Otherwise we get analysis output
         * after each move.
-        */ 
+        */
         if (first.analysisSupport) {
          SendToProgram("exit\nforce\n", &first);
          first.analyzing = FALSE;
        }
     }
-       
+
     if (gameMode == IcsExamining && !pausing) {
         SendToICS(ics_prefix);
        SendToICS("forward 999999\n");
@@ -11771,7 +11851,7 @@ BackwardInner(target)
     }
     if (gameMode == PlayFromGameFile && !pausing)
       PauseEvent();
-    
+
     if (moveList[target][0]) {
        int fromX, fromY, toX, toY;
         toX = moveList[target][2] - AAA;
@@ -11800,7 +11880,7 @@ BackwardInner(target)
     } else {
        currentMove = target;
     }
-    
+
     if (gameMode == EditGame || gameMode == EndOfGame) {
        whiteTimeRemaining = timeRemaining[0][currentMove];
        blackTimeRemaining = timeRemaining[1][currentMove];
@@ -11830,7 +11910,7 @@ ToStartEvent()
     if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) {
        /* to optimze, we temporarily turn off analysis mode while we undo
         * all the moves. Otherwise we get analysis output after each undo.
-        */ 
+        */
         if (first.analysisSupport) {
          SendToProgram("exit\nforce\n", &first);
          first.analyzing = FALSE;
@@ -12051,7 +12131,7 @@ PrintPosition(fp, move)
      int move;
 {
     int i, j;
-    
+
     for (i = BOARD_HEIGHT - 1; i >= 0; i--) {
         for (j = BOARD_LEFT; j < BOARD_RGHT; j++) {
            char c = PieceToChar(boards[move][i][j]);
@@ -12387,18 +12467,18 @@ SendToProgram(message, cps)
 
     if (cps->pr == NULL) return;
     Attention(cps);
-    
+
     if (appData.debugMode) {
        TimeMark now;
        GetTimeMark(&now);
-       fprintf(debugFP, "%ld >%-6s: %s", 
+       fprintf(debugFP, "%ld >%-6s: %s",
                SubtractTimeMarks(&now, &programStartTime),
                cps->which, message);
     }
-    
+
     count = strlen(message);
     outCount = OutputToProcess(cps->pr, message, count, &error);
-    if (outCount < count && !exiting 
+    if (outCount < count && !exiting
                          && !endingGame) { /* [HGM] crash: to not hang GameEnds() writing to deceased engines */
        sprintf(buf, _("Error writing to %s chess program"), cps->which);
         if(gameInfo.resultDetails==NULL) { /* [HGM] crash: if game in progress, give reason for abort */
@@ -12459,12 +12539,12 @@ ReceiveFromProgram(isr, closure, message, count, error)
        }
        return;
     }
-    
+
     if ((end_str = strchr(message, '\r')) != NULL)
       *end_str = NULLCHAR;
     if ((end_str = strchr(message, '\n')) != NULL)
       *end_str = NULLCHAR;
-    
+
     if (appData.debugMode) {
        TimeMark now; int print = 1;
        char *quote = ""; char c; int i;
@@ -12472,7 +12552,7 @@ ReceiveFromProgram(isr, closure, message, count, error)
        if(appData.engineComments != 1) { /* [HGM] debug: decide if protocol-violating output is written */
                char start = message[0];
                if(start >='A' && start <= 'Z') start += 'a' - 'A'; // be tolerant to capitalizing
-               if(sscanf(message, "%d%c%d%d%d", &i, &c, &i, &i, &i) != 5 && 
+               if(sscanf(message, "%d%c%d%d%d", &i, &c, &i, &i, &i) != 5 &&
                   sscanf(message, "move %c", &c)!=1  && sscanf(message, "offer%c", &c)!=1 &&
                   sscanf(message, "resign%c", &c)!=1 && sscanf(message, "feature %c", &c)!=1 &&
                   sscanf(message, "error %c", &c)!=1 && sscanf(message, "illegal %c", &c)!=1 &&
@@ -12484,8 +12564,8 @@ ReceiveFromProgram(isr, closure, message, count, error)
        }
        if(print) {
                GetTimeMark(&now);
-               fprintf(debugFP, "%ld <%-6s: %s%s\n", 
-                       SubtractTimeMarks(&now, &programStartTime), cps->which, 
+               fprintf(debugFP, "%ld <%-6s: %s%s\n",
+                       SubtractTimeMarks(&now, &programStartTime), cps->which,
                        quote,
                        message);
        }
@@ -12494,7 +12574,7 @@ ReceiveFromProgram(isr, closure, message, count, error)
     /* [DM] if icsEngineAnalyze is active we block all whisper and kibitz output, because nobody want to see this */
     if (appData.icsEngineAnalyze) {
         if (strstr(message, "whisper") != NULL ||
-             strstr(message, "kibitz") != NULL || 
+             strstr(message, "kibitz") != NULL ||
             strstr(message, "tellics") != NULL) return;
     }
 
@@ -12572,7 +12652,7 @@ SendTimeControl(cps, mps, tc, inc, sd, st)
 ChessProgramState *WhitePlayer()
 /* [HGM] return pointer to 'first' or 'second', depending on who plays white */
 {
-    if(gameMode == TwoMachinesPlay && first.twoMachinesColor[0] == 'b' || 
+    if(gameMode == TwoMachinesPlay && first.twoMachinesColor[0] == 'b' ||
        gameMode == BeginningOfGame || gameMode == MachinePlaysBlack)
         return &second;
     return &first;
@@ -12605,7 +12685,7 @@ SendTimeRemaining(cps, machineWhite)
 
     if (time <= 0) time = 1;
     if (otime <= 0) otime = 1;
-    
+
     sprintf(message, "time %ld\n", time);
     SendToProgram(message, cps);
 
@@ -12677,7 +12757,7 @@ StringFeature(p, name, loc, cps)
   return FALSE;
 }
 
-int 
+int
 ParseOption(Option *opt, ChessProgramState *cps)
 // [HGM] options: process the string that defines an engine option, and determine
 // name, type, default value, and allowed value range
@@ -12772,7 +12852,7 @@ FeatureDone(cps, val)
 void
 ParseFeatures(args, cps)
      char* args;
-     ChessProgramState *cps;  
+     ChessProgramState *cps;
 {
   char *p = args;
   char *q;
@@ -12784,10 +12864,10 @@ ParseFeatures(args, cps)
     if (*p == NULLCHAR) return;
 
     if (BoolFeature(&p, "setboard", &cps->useSetboard, cps)) continue;
-    if (BoolFeature(&p, "time", &cps->sendTime, cps)) continue;    
-    if (BoolFeature(&p, "draw", &cps->sendDrawOffers, cps)) continue;    
-    if (BoolFeature(&p, "sigint", &cps->useSigint, cps)) continue;    
-    if (BoolFeature(&p, "sigterm", &cps->useSigterm, cps)) continue;    
+    if (BoolFeature(&p, "time", &cps->sendTime, cps)) continue;
+    if (BoolFeature(&p, "draw", &cps->sendDrawOffers, cps)) continue;
+    if (BoolFeature(&p, "sigint", &cps->useSigint, cps)) continue;
+    if (BoolFeature(&p, "sigterm", &cps->useSigterm, cps)) continue;
     if (BoolFeature(&p, "reuse", &val, cps)) {
       /* Engine can disable reuse, but can't enable it if user said no */
       if (!val) cps->reuse = FALSE;
@@ -12926,7 +13006,7 @@ ShowThinkingEvent()
     int newState = appData.showThinking
        // [HGM] thinking: other features now need thinking output as well
        || !appData.hideThinkingFromHuman || appData.adjudicateLossThreshold != 0 || EngineOutputIsUp();
-    
+
     if (oldState == newState) return;
     oldState = newState;
     if (gameMode == EditPosition) EditPositionDone();
@@ -12963,8 +13043,8 @@ DisplayMove(moveNumber)
     char cpThinkOutput[MSG_SIZ];
 
     if(appData.noGUI) return; // [HGM] fast: suppress display of moves
-    
-    if (moveNumber == forwardMostMove - 1 || 
+
+    if (moveNumber == forwardMostMove - 1 ||
        gameMode == AnalyzeMode || gameMode == AnalyzeFile) {
 
        safeStrCpy(cpThinkOutput, thinkOutput, sizeof(cpThinkOutput));
@@ -13031,7 +13111,7 @@ DisplayComment(moveNumber, text)
         }
        // [HGM] PV info: display PV info together with (or as) comment
        if(moveNumber >= 0 && (depth = pvInfoList[moveNumber].depth) > 0) {
-           if(text == NULL) text = "";                                           
+           if(text == NULL) text = "";
            score = pvInfoList[moveNumber].score;
            sprintf(buf, "%s%.2f/%d %d\n%s", score>0 ? "+" : "", score/100.,
                               depth, (pvInfoList[moveNumber].time+50)/100, text);
@@ -13179,7 +13259,7 @@ GetTimeMark(tm)
     struct timezone timeZone;
 
     gettimeofday(&timeVal, &timeZone);
-    tm->sec = (long) timeVal.tv_sec; 
+    tm->sec = (long) timeVal.tv_sec;
     tm->ms = (int) (timeVal.tv_usec / 1000L);
 
 #else /*!HAVE_GETTIMEOFDAY*/
@@ -13218,7 +13298,7 @@ SubtractTimeMarks(tm2, tm1)
  * We give the human user a slight advantage if he is playing white---the
  * clocks don't run until he makes his first move, so it takes zero time.
  * Also, we don't account for network lag, so we could get out of sync
- * with GNU Chess's clock -- but then, referees are always right.  
+ * with GNU Chess's clock -- but then, referees are always right.
  */
 
 static TimeMark tickStartTM;
@@ -13251,7 +13331,7 @@ AdjustClock(Boolean which, int dir)
 
 /* Stop clocks and reset to a fresh time control */
 void
-ResetClocks() 
+ResetClocks()
 {
     (void) StopClockTimer();
     if (appData.icsActive) {
@@ -13279,7 +13359,7 @@ DecrementClocks()
 
     if (!appData.clockMode) return;
     if (gameMode==AnalyzeMode || gameMode == AnalyzeFile) return;
-       
+
     GetTimeMark(&now);
 
     lastTickLength = SubtractTimeMarks(&now, &tickStartTM);
@@ -13301,7 +13381,7 @@ DecrementClocks()
     }
 
     if (CheckFlags()) return;
-       
+
     tickStartTM = now;
     intendedTickLength = NextTickLength(timeRemaining - fudge) + fudge;
     StartClockTimer(intendedTickLength);
@@ -13309,9 +13389,9 @@ DecrementClocks()
     /* if the time remaining has fallen below the alarm threshold, sound the
      * alarm. if the alarm has sounded and (due to a takeback or time control
      * with increment) the time remaining has increased to a level above the
-     * threshold, reset the alarm so it can sound again. 
+     * threshold, reset the alarm so it can sound again.
      */
-    
+
     if (appData.icsActive && appData.icsAlarm) {
 
        /* make sure we are dealing with the user's clock */
@@ -13321,7 +13401,7 @@ DecrementClocks()
 
        if (alarmSounded && (timeRemaining > appData.icsAlarmTime)) {
            alarmSounded = FALSE;
-       } else if (!alarmSounded && (timeRemaining <= appData.icsAlarmTime)) { 
+       } else if (!alarmSounded && (timeRemaining <= appData.icsAlarmTime)) {
            PlayAlarmSound();
            alarmSounded = TRUE;
        }
@@ -13360,7 +13440,7 @@ SwitchClocks()
           whiteTimeRemaining -= lastTickLength;
            /* [HGM] PGNtime: save time for PGN file if engine did not give it */
 //         if(pvInfoList[forwardMostMove-1].time == -1)
-                 pvInfoList[forwardMostMove-1].time = 
+                 pvInfoList[forwardMostMove-1].time =
                       (timeRemaining[0][forwardMostMove-1] - whiteTimeRemaining)/10;
        }
        flagged = CheckFlags();
@@ -13390,12 +13470,12 @@ SwitchClocks()
       whiteTimeRemaining : blackTimeRemaining);
     StartClockTimer(intendedTickLength);
 }
-       
+
 
 /* Stop both clocks */
 void
 StopClocks()
-{      
+{
     long lastTickLength;
     TimeMark now;
 
@@ -13416,7 +13496,7 @@ StopClocks()
     }
     CheckFlags();
 }
-       
+
 /* Start clock of player on move.  Time may have been reset, so
    if clock is already running, stop and restart it. */
 void
@@ -13434,7 +13514,7 @@ StartClocks()
       whiteTimeRemaining : blackTimeRemaining);
 
    /* [HGM] nps: figure out nps factors, by determining which engine plays white and/or black once and for all */
-    whiteNPS = blackNPS = -1; 
+    whiteNPS = blackNPS = -1;
     if(gameMode == MachinePlaysWhite || gameMode == TwoMachinesPlay && first.twoMachinesColor[0] == 'w'
        || appData.zippyPlay && gameMode == IcsPlayingBlack) // first (perhaps only) engine has white
        whiteNPS = first.nps;
@@ -13457,7 +13537,7 @@ TimeString(ms)
     long second, minute, hour, day;
     char *sign = "";
     static char buf[32];
-    
+
     if (ms > 0 && ms <= 9900) {
       /* convert milliseconds to tenths, rounding up */
       double tenths = floor( ((double)(ms + 99L)) / 100.00 );
@@ -13475,14 +13555,14 @@ TimeString(ms)
        sign = "-";
        second = -second;
     }
-    
+
     day = second / (60 * 60 * 24);
     second = second % (60 * 60 * 24);
     hour = second / (60 * 60);
     second = second % (60 * 60);
     minute = second / 60;
     second = second % 60;
-    
+
     if (day > 0)
       sprintf(buf, " %s%ld:%02ld:%02ld:%02ld ",
              sign, day, hour, minute, second);
@@ -13490,7 +13570,7 @@ TimeString(ms)
       sprintf(buf, " %s%ld:%02ld:%02ld ", sign, hour, minute, second);
     else
       sprintf(buf, " %s%2ld:%02ld ", sign, minute, second);
-    
+
     return buf;
 }
 
@@ -13503,13 +13583,13 @@ StrStr(string, match)
      char *string, *match;
 {
     int i, length;
-    
+
     length = strlen(match);
-    
+
     for (i = strlen(string) - length; i >= 0; i--, string++)
       if (!strncmp(match, string, length))
        return string;
-    
+
     return NULL;
 }
 
@@ -13518,9 +13598,9 @@ StrCaseStr(string, match)
      char *string, *match;
 {
     int i, j, length;
-    
+
     length = strlen(match);
-    
+
     for (i = strlen(string) - length; i >= 0; i--, string++) {
        for (j = 0; j < length; j++) {
            if (ToLower(match[j]) != ToLower(string[j]))
@@ -13538,7 +13618,7 @@ StrCaseCmp(s1, s2)
      char *s1, *s2;
 {
     char c1, c2;
-    
+
     for (;;) {
        c1 = ToLower(*s1++);
        c2 = ToLower(*s2++);
@@ -13638,7 +13718,7 @@ PositionToFEN(move, overrideCastling)
                     /* [HGM] write promoted pieces as '+<unpromoted>' (Shogi) */
                     *p++ = '+';
                     piece = (ChessSquare)(DEMOTED piece);
-                } 
+                }
                 *p++ = PieceToChar(piece);
                 if(p[-1] == '~') {
                     /* [HGM] flag promoted pieces as '<promoted>~' (Crazyhouse) */
@@ -13721,7 +13801,7 @@ PositionToFEN(move, overrideCastling)
   }
 
   if(gameInfo.variant != VariantShogi    && gameInfo.variant != VariantXiangqi &&
-     gameInfo.variant != VariantShatranj && gameInfo.variant != VariantCourier ) { 
+     gameInfo.variant != VariantShatranj && gameInfo.variant != VariantCourier ) {
     /* En passant target square */
     if (move > backwardMostMove) {
         fromX = moveList[move - 1][0] - AAA;
@@ -13770,7 +13850,7 @@ PositionToFEN(move, overrideCastling)
     }
     /* Fullmove number */
     sprintf(p, "%d", (move / 2) + 1);
-    
+
     return StrSave(buf);
 }
 
@@ -13878,7 +13958,7 @@ ParseFEN(board, blackPlaysFirst, fen)
       case 'w':
         *blackPlaysFirst = FALSE;
        break;
-      case 'b': 
+      case 'b':
        *blackPlaysFirst = TRUE;
        break;
       default:
@@ -13981,7 +14061,7 @@ ParseFEN(board, blackPlaysFirst, fen)
 
     /* read e.p. field in games that know e.p. capture */
     if(gameInfo.variant != VariantShogi    && gameInfo.variant != VariantXiangqi &&
-       gameInfo.variant != VariantShatranj && gameInfo.variant != VariantCourier ) { 
+       gameInfo.variant != VariantShatranj && gameInfo.variant != VariantCourier ) {
       if(*p=='-') {
         p++; FENepStatus = EP_NONE;
       } else {
@@ -14001,7 +14081,7 @@ ParseFEN(board, blackPlaysFirst, fen)
 
     return TRUE;
 }
-      
+
 void
 EditPositionPasteFEN(char *fen)
 {
diff --git a/callback.c b/callback.c
new file mode 100644 (file)
index 0000000..0f481f0
--- /dev/null
@@ -0,0 +1,1019 @@
+#include <gtk/gtk.h>
+#include "common.h"
+#include "xboard.h"
+#include <errno.h>
+#include "backend.h"
+
+#ifdef ENABLE_NLS
+# define  _(s) gettext (s)
+# define N_(s) gettext_noop (s)
+#else
+# define  _(s) (s)
+# define N_(s)  s
+#endif
+
+extern GtkWidget  *about;
+extern GtkWidget  *GUI_Window;
+extern GtkWidget  *GUI_Aspect;
+extern GtkWidget  *GUI_Menubar;
+extern GtkWidget  *GUI_Timer;
+extern GtkWidget  *GUI_Buttonbar;
+extern GtkWidget  *GUI_Board;
+
+extern char *programVersion;
+extern int errorExitStatus;
+extern int promotionUp;
+extern int fromX;
+extern int fromY;
+extern int toX;
+extern int toY;
+extern int squareSize,lineGap;
+
+extern int LoadGamePopUp P((FILE *f, int gameNumber, char *title));
+extern int LoadPosition P((FILE *f, int gameNumber, char *title));
+extern int SaveGame P((FILE *f, int gameNumber, char *title));
+extern int SavePosition P((FILE *f, int gameNumber, char *title));
+
+gboolean
+ExposeProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  /* do resizing to a fixed aspect ratio */
+  GtkRequisition w;
+  int totalh=0,nw,nh;
+  float ratio;
+  int boardWidth,boardHeight,old,new;
+
+  nw=GTK_WIDGET(object)->allocation.width;
+  nh=GTK_WIDGET(object)->allocation.height;
+
+  old=squareSize;
+  squareSize  = nw/(BOARD_WIDTH*1.05+0.05);
+
+  if(old!=squareSize)
+    {
+      lineGap = squareSize*0.05;
+
+      boardWidth  = lineGap + BOARD_WIDTH  * (squareSize + lineGap);
+      boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap);
+
+      /* get the height of the menus, etc. and calculate the aspect ratio */
+      gtk_widget_size_request(GTK_WIDGET(GUI_Menubar),   &w);
+      totalh += w.height;
+      gtk_widget_size_request(GTK_WIDGET(GUI_Timer),   &w);
+      totalh += w.height;
+      gtk_widget_size_request(GTK_WIDGET(GUI_Buttonbar),   &w);
+      totalh += w.height;
+
+      ratio  = ((float)totalh+boardHeight)/((float)boardWidth) ;
+
+      gtk_widget_set_size_request(GTK_WIDGET(GUI_Board),
+                                 boardWidth,boardHeight);
+
+      gtk_aspect_frame_set (GTK_ASPECT_FRAME(GUI_Aspect),0,0,ratio,TRUE);
+
+      /* recreate pieces with new size... TODO: keep svg in memory and just recreate pixmap instead of reloading files */
+      CreatePieces();
+    }
+  return FALSE; /* return false, so that other expose events are called too */
+}
+
+void
+QuitProc (object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  gtk_main_quit();
+  ExitEvent(0);
+}
+
+/* Help Menu */
+void InfoProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    char buf[MSG_SIZ];
+    snprintf(buf, sizeof(buf), "xterm -e info --directory %s --directory . -f %s &",
+           INFODIR, INFOFILE);
+    system(buf);
+    return;
+}
+
+void ManProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    char buf[MSG_SIZ];
+    snprintf(buf, sizeof(buf), "xterm -e man xboard &");
+    system(buf);
+    return;
+}
+
+void HintProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    HintEvent();
+    return;
+}
+
+void BookProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    BookEvent();
+    return;
+}
+
+void AboutProc (object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  GtkWidget               *about;
+
+  const gchar *authors[] = {"Tim Mann <tim@tim-mann.org>",
+                           "John Chanak",
+                           "Evan Welsh <Evan.Welsh@msdw.com>",
+                           "Elmar Bartel <bartel@informatik.tu-muenchen.de>",
+                           "Jochen Wiedmann",
+                           "Frank McIngvale",
+                           "Hugh Fisher <Hugh.Fisher@cs.anu.edu.au>",
+                           "Allessandro Scotti",
+                           "H.G. Muller <h.g.muller AT hccnet DOT nl>",
+                           "Eric Mullins <emwine AT earthlink DOT net>",
+                           "Arun Persaud <arun@nubati.net>"};
+
+  /* set up about window */
+  about =  GTK_WIDGET(gtk_about_dialog_new());
+
+  /* fill in some information */
+  char buf[MSG_SIZ];
+#if ZIPPY
+  char *zippy = " (with Zippy code)";
+#else
+  char *zippy = "";
+#endif
+  sprintf(buf, "%s%s",  programVersion, zippy);
+
+  gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about),buf);
+
+  gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about),
+                                "Copyright 1991 Digital Equipment Corporation\n"
+                                "Enhancements Copyright 1992-2009 Free Software Foundation\n"
+                                "Enhancements Copyright 2005 Alessandro Scotti");
+  gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(about),"http://www.gnu.org/software/xboard/");
+  gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(about),authors);
+  gtk_about_dialog_set_translator_credits(GTK_ABOUT_DIALOG(about),
+                                         " A. Alper (turkish)\n"
+                                         " A. Persaud (german)\n");
+
+  /* end set up about window */
+  gtk_dialog_run(GTK_DIALOG (about));
+  gtk_widget_destroy(about);
+}
+
+/* End Help Menu */
+
+void IcsClientProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    IcsClientEvent();
+    return;
+}
+
+/*
+ * File menu
+ */
+
+void
+LoadNextGameProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    ReloadGame(1);
+    return;
+}
+
+void
+LoadPrevGameProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    ReloadGame(-1);
+    return;
+}
+
+void
+ReloadGameProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    ReloadGame(0);
+    return;
+}
+
+void
+LoadNextPositionProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    ReloadPosition(1);
+    return;
+}
+
+void
+LoadPrevPositionProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    ReloadPosition(-1);
+    return;
+}
+
+void
+ReloadPositionProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    ReloadPosition(0);
+    return;
+}
+
+void
+LoadPositionProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  if (gameMode == AnalyzeMode || gameMode == AnalyzeFile)
+    {
+      Reset(FALSE, TRUE);
+    };
+
+  FileNamePopUp(_("Load position file name?"), "", LoadPosition, "rb");
+  return;
+}
+
+void
+SaveGameProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  FileNamePopUp(_("Save game file name?"),
+               DefaultFileName(appData.oldSaveStyle ? "game" : "pgn"),
+               SaveGame, "a");
+  return;
+}
+
+void
+SavePositionProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  FileNamePopUp(_("Save position file name?"),
+               DefaultFileName(appData.oldSaveStyle ? "pos" : "fen"),
+               SavePosition, "a");
+  return;
+}
+
+void
+AnalyzeFileProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  if (!first.analysisSupport)
+    {
+      char buf[MSG_SIZ];
+      snprintf(buf, sizeof(buf), _("%s does not support analysis"), first.tidy);
+      DisplayError(buf, 0);
+      return;
+    };
+  Reset(FALSE, TRUE);
+
+  if (!appData.showThinking)
+    ShowThinkingProc(NULL,NULL);
+
+  AnalyzeFileEvent();
+  FileNamePopUp(_("File to analyze"), "", LoadGamePopUp, "rb");
+  AnalysisPeriodicEvent(1);
+  return;
+}
+
+
+/* End File Menu */
+
+void MachineWhiteProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    MachineWhiteEvent();
+    return;
+}
+
+void MachineBlackProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    MachineBlackEvent();
+    return;
+}
+
+void TwoMachinesProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    TwoMachinesEvent();
+    return;
+}
+
+void AcceptProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    AcceptEvent();
+    return;
+}
+
+void DeclineProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    DeclineEvent();
+    return;
+}
+
+void RematchProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    RematchEvent();
+    return;
+}
+
+void CallFlagProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    CallFlagEvent();
+    return;
+}
+
+void DrawProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    DrawEvent();
+    return;
+}
+
+void AbortProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    AbortEvent();
+    return;
+}
+
+void AdjournProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    AdjournEvent();
+    return;
+}
+
+void ResignProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    ResignEvent();
+    return;
+}
+
+void StopObservingProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    StopObservingEvent();
+    return;
+}
+
+void StopExaminingProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    StopExaminingEvent();
+    return;
+}
+
+void AdjuWhiteProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    UserAdjudicationEvent(+1);
+    return;
+}
+
+void AdjuBlackProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    UserAdjudicationEvent(-1);
+    return;
+}
+
+void AdjuDrawProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    UserAdjudicationEvent(0);
+    return;
+}
+
+void BackwardProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    BackwardEvent();
+    return;
+}
+
+void ForwardProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    ForwardEvent();
+    return;
+}
+
+void ToStartProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    ToStartEvent();
+    return;
+}
+
+void ToEndProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    ToEndEvent();
+    return;
+}
+
+void RevertProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    RevertEvent();
+    return;
+}
+
+void TruncateGameProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    TruncateGameEvent();
+    return;
+}
+
+void MoveNowProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    MoveNowEvent();
+    return;
+}
+
+void RetractMoveProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    RetractMoveEvent();
+    return;
+}
+
+/* Option Menu */
+void 
+AutocommProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    appData.autoComment = !appData.autoComment;
+    return;
+}
+
+void 
+AutoflagProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    appData.autoCallFlag = !appData.autoCallFlag;
+    return;
+}
+
+void 
+AutoflipProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    appData.autoFlipView = !appData.autoFlipView;
+    return;
+}
+
+void 
+ShowThinkingProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    appData.showThinking = !appData.showThinking;
+    ShowThinkingEvent();
+
+    return;
+}
+
+void 
+HideThinkingProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    appData.hideThinkingFromHuman = !appData.hideThinkingFromHuman;
+    ShowThinkingEvent();
+
+    return;
+}
+
+void 
+FlipViewProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    flipView = !flipView;
+    DrawPosition(True, NULL);
+    return;
+}
+
+void 
+AlwaysQueenProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.alwaysPromoteToQueen = !appData.alwaysPromoteToQueen;
+  return;
+}
+
+void 
+AnimateDraggingProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.animateDragging = !appData.animateDragging;
+
+  if (appData.animateDragging) 
+    {
+      // TODO convert to gtk
+      //      CreateAnimVars();
+    };
+
+  return;
+}
+
+void 
+AnimateMovingProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.animate = !appData.animate;
+  
+  if (appData.animate) 
+    {
+      // TODO convert to gtk
+      //      CreateAnimVars();
+    };
+
+  return;
+}
+
+void 
+AutobsProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.autoObserve = !appData.autoObserve;
+  return;
+}
+
+void 
+AutoraiseProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.autoRaiseBoard = !appData.autoRaiseBoard;
+  return;
+}
+
+void 
+AutosaveProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.autoSaveGames = !appData.autoSaveGames;
+  return;
+}
+
+void 
+BlindfoldProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.blindfold = !appData.blindfold;
+  DrawPosition(True, NULL);
+  return;
+}
+
+void 
+TestLegalityProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.testLegality = !appData.testLegality;
+  return;
+}
+
+void 
+FlashMovesProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  if (appData.flashCount == 0) 
+    {
+      appData.flashCount = 3;
+    }
+  else 
+    {
+      appData.flashCount = -appData.flashCount;
+    };
+  
+    // TODO: check if this is working correct*/
+    return;
+}
+
+#if HIGHDRAG
+void 
+HighlightDraggingProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  /* TODO: connect to option menu */
+  appData.highlightDragging = !appData.highlightDragging;
+  return;
+}
+#endif
+
+void 
+HighlightLastMoveProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.highlightLastMove = !appData.highlightLastMove;
+  return;
+}
+
+void 
+IcsAlarmProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.icsAlarm = !appData.icsAlarm;
+  return;
+}
+
+void 
+MoveSoundProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.ringBellAfterMoves = !appData.ringBellAfterMoves;
+  return;
+}
+
+void 
+OldSaveStyleProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.oldSaveStyle = !appData.oldSaveStyle;
+  return;
+}
+
+void 
+PeriodicUpdatesProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  PeriodicUpdatesEvent(!appData.periodicUpdates);
+  return;
+}
+
+/* end option menu */
+
+gboolean CloseWindowProc(GtkWidget *button)
+{
+    gtk_widget_destroy(gtk_widget_get_toplevel(button));
+    return TRUE;
+}
+
+void
+ResetProc (object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  ResetGameEvent();
+  return;
+}
+
+void WhiteClockProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    if (gameMode == EditPosition || gameMode == IcsExamining) {
+       SetWhiteToPlayEvent();
+    } else if (gameMode == IcsPlayingBlack || gameMode == MachinePlaysWhite) {
+       CallFlagEvent();
+    }
+}
+
+void BlackClockProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    if (gameMode == EditPosition || gameMode == IcsExamining) {
+       SetBlackToPlayEvent();
+    } else if (gameMode == IcsPlayingWhite || gameMode == MachinePlaysBlack) {
+       CallFlagEvent();
+    }
+}
+
+
+void ShowCoordsProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    appData.showCoords = !appData.showCoords;
+
+    DrawPosition(True, NULL);
+}
+
+void ErrorPopDownProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  gtk_widget_destroy(GTK_WIDGET(object));
+  ErrorPopDown();
+}
+
+void PauseProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    // todo this toggling of the pause button doesn't seem to work?
+    // e.g. select pause from buttonbar doesn't activate menumode.pause
+  PauseEvent();
+}
+
+
+void LoadGameProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  FileNamePopUp(_("Load game file name?"),"",LoadGamePopUp,"rb");
+  return;
+}
+
+
+/*************
+ * EVENTS
+ *************/
+
+void EventProc(window, event, data)
+     GtkWindow *window;
+     GdkEvent *event;
+     gpointer data;
+{
+  /* todo do we still need this?
+    if (!XtIsRealized(widget))
+      return;
+  */
+
+    switch (event->type) {
+      case GDK_EXPOSE:
+       if (event->expose.count > 0) return;  /* no clipping is done */
+       DrawPosition(True, NULL);
+       break;
+      default:
+       return;
+    }
+}
+
+
+/*
+ * event handler for parsing user moves
+ */
+void UserMoveProc(window, event, data)
+     GtkWindow *window;
+     GdkEvent *event;
+     gpointer data;
+{
+    int x, y;
+    Boolean saveAnimate;
+    static int second = 0;
+
+    if (errorExitStatus != -1) return;
+
+    if (event->type == GDK_BUTTON_PRESS) ErrorPopDown();
+
+    if (promotionUp)
+      {
+       if (event->type == GDK_BUTTON_PRESS)
+         {
+           /* todo add promotionshellwidget
+              XtPopdown(promotionShell);
+              XtDestroyWidget(promotionShell); */
+           promotionUp = False;
+           ClearHighlights();
+           fromX = fromY = -1;
+         }
+       else
+         {
+           return;
+         }
+      }
+
+    x = EventToSquare( (int)event->button.x, BOARD_WIDTH  );
+    y = EventToSquare( (int)event->button.y, BOARD_HEIGHT );
+    if (!flipView && y >= 0)
+      {
+       y = BOARD_HEIGHT - 1 - y;
+      }
+    if (flipView && x >= 0)
+      {
+       x = BOARD_WIDTH - 1 - x;
+      }
+
+    if (fromX == -1)
+      {
+       if (event->type == ButtonPress)
+         {
+           /* First square */
+           if (OKToStartUserMove(x, y))
+             {
+               fromX = x;
+               fromY = y;
+               second = 0;
+               DragPieceBegin(event->button.x, event->button.y);
+               if (appData.highlightDragging)
+                 {
+                   SetHighlights(x, y, -1, -1);
+                 }
+             }
+         }
+       return;
+      }
+
+    /* fromX != -1 */
+    if (event->type == GDK_BUTTON_PRESS && gameMode != EditPosition &&
+       x >= 0 && y >= 0) {
+       ChessSquare fromP;
+       ChessSquare toP;
+       /* Check if clicking again on the same color piece */
+       fromP = boards[currentMove][fromY][fromX];
+       toP = boards[currentMove][y][x];
+       if ((WhitePawn <= fromP && fromP <= WhiteKing &&
+            WhitePawn <= toP && toP <= WhiteKing) ||
+           (BlackPawn <= fromP && fromP <= BlackKing &&
+            BlackPawn <= toP && toP <= BlackKing)) {
+           /* Clicked again on same color piece -- changed his mind */
+           second = (x == fromX && y == fromY);
+           if (appData.highlightDragging) {
+               SetHighlights(x, y, -1, -1);
+           } else {
+               ClearHighlights();
+           }
+           if (OKToStartUserMove(x, y)) {
+               fromX = x;
+               fromY = y;
+               DragPieceBegin(event->button.x, event->button.y);
+           }
+           return;
+       }
+    }
+
+    if (event->type == GDK_BUTTON_RELEASE &&   x == fromX && y == fromY)
+      {
+       DragPieceEnd(event->button.x, event->button.y);
+       if (appData.animateDragging)
+         {
+           /* Undo animation damage if any */
+           DrawPosition(FALSE, NULL);
+         }
+       if (second)
+         {
+           /* Second up/down in same square; just abort move */
+           second = 0;
+           fromX = fromY = -1;
+           ClearHighlights();
+           gotPremove = 0;
+           ClearPremoveHighlights();
+         }
+       else
+         {
+           /* First upclick in same square; start click-click mode */
+           SetHighlights(x, y, -1, -1);
+         }
+       return;
+      }
+
+    /* Completed move */
+    toX = x;
+    toY = y;
+    saveAnimate = appData.animate;
+
+    if (event->type == GDK_BUTTON_PRESS)
+      {
+       /* Finish clickclick move */
+       if (appData.animate || appData.highlightLastMove)
+         {
+           SetHighlights(fromX, fromY, toX, toY);
+         }
+       else
+         {
+           ClearHighlights();
+         }
+      }
+    else
+      {
+       /* Finish drag move */
+       if (appData.highlightLastMove)
+         {
+           SetHighlights(fromX, fromY, toX, toY);
+         }
+       else
+         {
+           ClearHighlights();
+         }
+       DragPieceEnd(event->button.x, event->button.y);
+       /* Don't animate move and drag both */
+       appData.animate = FALSE;
+      }
+
+    if (IsPromotion(fromX, fromY, toX, toY))
+      {
+       if (appData.alwaysPromoteToQueen)
+         {
+           UserMoveEvent(fromX, fromY, toX, toY, 'q');
+           if (!appData.highlightLastMove || gotPremove) ClearHighlights();
+           if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY);
+           fromX = fromY = -1;
+         }
+       else
+         {
+           SetHighlights(fromX, fromY, toX, toY);
+           PromotionPopUp();
+         }
+      }
+    else
+      {
+       UserMoveEvent(fromX, fromY, toX, toY, NULLCHAR);
+
+       if (!appData.highlightLastMove || gotPremove) ClearHighlights();
+       if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY);
+       fromX = fromY = -1;
+      }
+
+    appData.animate = saveAnimate;
+    if (appData.animate || appData.animateDragging) {
+       /* Undo animation damage if needed */
+       DrawPosition(FALSE, NULL);
+    }
+
+    return;
+}
+
+void GetMoveListProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.getMoveList = !appData.getMoveList;
+
+  if (appData.getMoveList)
+    {
+      GetMoveListEvent();
+    }
+
+  // gets set automatically? if we set it with set_active we end up in an endless loop switching between 0 and 1
+  //  gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (object),(gboolean) appData.getMoveList );
+
+  return;
+}
diff --git a/callback.h b/callback.h
new file mode 100644 (file)
index 0000000..6f67e26
--- /dev/null
@@ -0,0 +1,84 @@
+void IcsClientProc P((GtkObject *object, gpointer user_data));
+void MachineBlackProc P((GtkObject *object, gpointer user_data));
+void MachineWhiteProc P((GtkObject *object, gpointer user_data));
+void TwoMachinesProc P((GtkObject *object, gpointer user_data));
+void AcceptProc P((GtkObject *object, gpointer user_data));
+void DeclineProc P((GtkObject *object, gpointer user_data));
+void RematchProc P((GtkObject *object, gpointer user_data));
+void CallFlagProc P((GtkObject *object, gpointer user_data));
+void Drawroc P((GtkObject *object, gpointer user_data));
+void AbortProc P((GtkObject *object, gpointer user_data));
+void AdjournProc P((GtkObject *object, gpointer user_data));
+void ResignProc P((GtkObject *object, gpointer user_data));
+void StopObservingProc P((GtkObject *object, gpointer user_data));
+void StopExaminingProc P((GtkObject *object, gpointer user_data));
+void AdjuWhiteProc P((GtkObject *object, gpointer user_data));
+void AdjuBlackProc P((GtkObject *object, gpointer user_data));
+void AdjuDrawProc P((GtkObject *object, gpointer user_data));
+void ResetProc P((GtkObject *object, gpointer user_data));
+void WhiteClockProc P((GtkObject *object, gpointer user_data));
+void BlackClockProc P((GtkObject *object, gpointer user_data));
+gboolean ExposeProc P((GtkObject *object, gpointer user_data));
+
+/* File Menu */
+void QuitProc P((GtkObject *object, gpointer user_data));
+void LoadNextGameProc P((GtkObject *object, gpointer user_data));
+void LoadPrevGameProc P((GtkObject *object, gpointer user_data));
+void ReloadGameProc P((GtkObject *object, gpointer user_data));
+void LoadNextPositionProc P((GtkObject *object, gpointer user_data));
+void LoadPrevPositionProc P((GtkObject *object, gpointer user_data));
+void ReloadPositionProc P((GtkObject *object, gpointer user_data));
+void LoadPositionProc P((GtkObject *object, gpointer user_data));
+void SaveGameProc P((GtkObject *object, gpointer user_data));
+void SavePositionProc P((GtkObject *object, gpointer user_data));
+
+/* Step Menu */
+void BackwardProc P((GtkObject *object, gpointer user_data));
+void ForwardProc P((GtkObject *object, gpointer user_data));
+void ToStartProc P((GtkObject *object, gpointer user_data));
+void ToEndProc P((GtkObject *object, gpointer user_data));
+void RevertProc P((GtkObject *object, gpointer user_data));
+void TruncateGameProc P((GtkObject *object, gpointer user_data));
+void MoveNowProc P((GtkObject *object, gpointer user_data));
+void RetractMoveProc P((GtkObject *object, gpointer user_data));
+
+/* Option Menu */
+void AutocommProc P((GtkObject *object, gpointer user_data));
+void AutoflagProc P((GtkObject *object, gpointer user_data));
+void AutoflipProc P((GtkObject *object, gpointer user_data));
+void ShowThinkingProc P((GtkObject *object, gpointer user_data));
+void HideThinkingProc P((GtkObject *object, gpointer user_data));
+void FlipViewProc P((GtkObject *object, gpointer user_data));
+void GetMoveListProc P((GtkObject *object, gpointer user_data));
+
+void AlwaysQueenProc P((GtkObject *object, gpointer user_data));
+void AnimateDraggingProc P((GtkObject *object, gpointer user_data));
+void AnimateMovingProc P((GtkObject *object, gpointer user_data));
+void AutobsProc P((GtkObject *object, gpointer user_data));
+void AutoraiseProc P((GtkObject *object, gpointer user_data));
+void AutosaveProc P((GtkObject *object, gpointer user_data));
+void BlindfoldProc P((GtkObject *object, gpointer user_data));
+void TestLegalityProc P((GtkObject *object, gpointer user_data));
+void FlashMovesProc P((GtkObject *object, gpointer user_data));
+void HighlightDraggingProc P((GtkObject *object, gpointer user_data));
+void HighlightLastMoveProc P((GtkObject *object, gpointer user_data));
+void IcsAlarmProc P((GtkObject *object, gpointer user_data));
+void MoveSoundProc P((GtkObject *object, gpointer user_data));
+void OldSaveStyleProc P((GtkObject *object, gpointer user_data));
+void PeriodicUpdatesProc P((GtkObject *object, gpointer user_data));
+
+/* Help Menu */
+
+void InfoProc  P((GtkObject *object, gpointer user_data));
+void ManProc  P((GtkObject *object, gpointer user_data));
+void HintProc  P((GtkObject *object, gpointer user_data));
+void BookProc  P((GtkObject *object, gpointer user_data));
+void AboutProc  P((GtkObject *object, gpointer user_data));
+
+
+void ShowCoordsProc P((GtkObject *object, gpointer user_data));
+void ErrorPopDownProc P((GtkObject *object, gpointer user_data));
+void PauseProc P((GtkObject *object, gpointer user_data));
+void EventProc P((GtkWindow *window, GdkEvent *event, gpointer data));
+void UserMoveProc P((GtkWindow *window, GdkEvent *event, gpointer data));
+gboolean CloseWindowProc P((GtkWidget *button));
index c488ad9..7c761ed 100644 (file)
@@ -28,7 +28,7 @@ dnl| to regenerate configure.  Then submit your changes to be folded into
 dnl| the standard version of xboard.
 
 dnl| define second argument as VERSION.PATCHLEVEL. e.g. 4.4.0j
-AC_INIT([xboard],[4.4.1.20091022],[bug-xboard@gnu.org])
+AC_INIT([xboard],[5.0.0.20090730],[bug-xboard@gnu.org])
 AM_INIT_AUTOMAKE
 
 AC_CONFIG_HEADERS([config.h])
@@ -88,6 +88,10 @@ AC_SUBST(NROFFFLAGS)
 AC_PATH_PROGS(AWKPATH, awk mawk gawk nawk)
 AC_PATH_PROGS(PERLPATH, perl)
 
+PKG_CHECK_MODULES([GTK], [gtk+-2.0 >= 2.16.0 gmodule-export-2.0 ])
+AC_SUBST(GTK_CFLAGS)
+AC_SUBST(GTK_LIBS)
+
 AC_HEADER_STDC
 AC_HEADER_TIME
 AC_HEADER_SYS_WAIT
index 88a3e0d..66455aa 100644 (file)
@@ -55,6 +55,7 @@
 #define _FRONTEND
 
 #include <stdio.h>
+#include <glib.h>
 
 typedef VOIDSTAR ProcRef;
 #define NoProc ((ProcRef) 0)
@@ -115,7 +116,7 @@ void StartLoadGameTimer P((long millisec));
 void AutoSaveGame P((void));
 
 typedef void (*DelayedEventCallback) P((void));
-void ScheduleDelayedEvent P((DelayedEventCallback cb, long millisec));
+void ScheduleDelayedEvent P((DelayedEventCallback cb, guint millisec));
 DelayedEventCallback GetDelayedEvent P((void));
 void CancelDelayedEvent P((void));
 // [HGM] mouse: next six used by mouse handler, which was moved to backend
diff --git a/gtk-interface.xml b/gtk-interface.xml
new file mode 100644 (file)
index 0000000..7f294e2
--- /dev/null
@@ -0,0 +1,1165 @@
+<?xml version="1.0"?>
+<interface>
+  <requires lib="gtk+" version="2.16"/>
+  <!-- interface-naming-policy project-wide -->
+  <object class="GtkListStore" id="MoveHistoryStore">
+    <columns>
+      <!-- column-name Move -->
+      <column type="gint"/>
+      <!-- column-name White -->
+      <column type="gchararray"/>
+      <!-- column-name Black -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
+  <object class="GtkDialog" id="MoveHistory">
+    <property name="border_width">5</property>
+    <property name="type_hint">normal</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="dialog-vbox1">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">2</property>
+        <child>
+          <object class="GtkScrolledWindow" id="scrolledwindow1">
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="hscrollbar_policy">automatic</property>
+            <property name="vscrollbar_policy">automatic</property>
+            <child>
+              <object class="GtkTreeView" id="MoveHistoryView">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="model">MoveHistoryStore</property>
+                <property name="headers_clickable">False</property>
+                <property name="enable_search">False</property>
+                <property name="search_column">0</property>
+                <child>
+                  <object class="GtkTreeViewColumn" id="Move">
+                    <property name="title">Move</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="MoveNumberRenderer"/>
+                      <attributes>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkTreeViewColumn" id="White">
+                    <property name="title">White</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="MoveWhiteRenderer"/>
+                      <attributes>
+                        <attribute name="text">1</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkTreeViewColumn" id="Black">
+                    <property name="title">Black</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="MoveBlackRenderer"/>
+                      <attributes>
+                        <attribute name="text">2</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="dialog-action_area1">
+            <property name="visible">True</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="CloseButton">
+                <property name="label" translatable="yes">gtk-close</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+                <signal name="released" handler="HistoryPopDown"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="0">CloseButton</action-widget>
+    </action-widgets>
+  </object>
+  <object class="GtkWindow" id="MainWindow">
+    <property name="events">GDK_EXPOSURE_MASK | GDK_STRUCTURE_MASK | GDK_PROPERTY_CHANGE_MASK</property>
+    <property name="title" translatable="yes">XBoard</property>
+    <signal name="destroy" handler="QuitProc"/>
+    <signal name="expose_event" handler="ExposeProc"/>
+    <child>
+      <object class="GtkAspectFrame" id="Aspectframe">
+        <property name="visible">True</property>
+        <property name="label_xalign">0</property>
+        <property name="shadow_type">none</property>
+        <property name="xalign">0</property>
+        <property name="yalign">0</property>
+        <property name="obey_child">False</property>
+        <child>
+          <object class="GtkVBox" id="MenuBox">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <object class="GtkMenuBar" id="MenuBar">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkMenuItem" id="MenuItemFile">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">_File</property>
+                    <property name="use_underline">True</property>
+                    <child type="submenu">
+                      <object class="GtkMenu" id="MenuFile">
+                        <property name="visible">True</property>
+                        <child>
+                          <object class="GtkMenuItem" id="menuFile.Reset Game">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Reset Game</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="ResetProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkSeparatorMenuItem" id="separatormenuitem1">
+                            <property name="visible">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkImageMenuItem" id="menuFile.Load Game">
+                            <property name="label" translatable="yes">Load Game</property>
+                            <property name="visible">True</property>
+                            <property name="image">image1</property>
+                            <property name="use_stock">False</property>
+                            <signal name="activate" handler="LoadGameProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuFile.Load Next Game">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Load Next Game</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="LoadNextGameProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuFile.Load Previous Game">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Load Previous Game</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuFile.Reload Same Game">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Reload Same Game</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="ReloadGameProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkImageMenuItem" id="menuFile.Save Game">
+                            <property name="label" translatable="yes">Save Game</property>
+                            <property name="visible">True</property>
+                            <property name="image">image2</property>
+                            <property name="use_stock">False</property>
+                            <signal name="activate" handler="SaveGameProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkSeparatorMenuItem" id="separatormenuitem2">
+                            <property name="visible">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuFile.Copy Game">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Copy Game</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuFile.Paste Game">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Paste Game</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkSeparatorMenuItem" id="separatormenuitem3">
+                            <property name="visible">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuFile.Load Position">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Load Position</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuFile.Load Next Position">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Load Next Position</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuFile.Load Previous Position">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Load Previous Position</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuFile.Reload Same Position">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Reload Same Position</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuFile.Save Position">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Save Position</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="SavePositionProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkSeparatorMenuItem" id="separatormenuitem4">
+                            <property name="visible">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuFile.Copy Position">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Copy Position</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuFile.Paste Position">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Paste Position</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkSeparatorMenuItem" id="separatormenuitem5">
+                            <property name="visible">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuFile.Mail Move">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Mail Move</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuFile.Reload CMail Message">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Reload CMail Message</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkSeparatorMenuItem" id="separatormenuitem6">
+                            <property name="visible">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkImageMenuItem" id="menuFile.Quit">
+                            <property name="label">gtk-quit</property>
+                            <property name="visible">True</property>
+                            <property name="use_underline">True</property>
+                            <property name="use_stock">True</property>
+                            <accelerator key="q" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+                            <signal name="activate" handler="QuitProc"/>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkMenuItem" id="MenuItemMode">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">_Mode</property>
+                    <property name="use_underline">True</property>
+                    <child type="submenu">
+                      <object class="GtkMenu" id="menu2">
+                        <property name="visible">True</property>
+                        <child>
+                          <object class="GtkRadioMenuItem" id="menuMode.Machine White">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Machine White</property>
+                            <property name="use_underline">True</property>
+                            <property name="draw_as_radio">True</property>
+                            <signal name="activate" handler="MachineWhiteProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkRadioMenuItem" id="menuMode.Machine Black">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Machine Black</property>
+                            <property name="use_underline">True</property>
+                            <property name="draw_as_radio">True</property>
+                            <property name="group">menuMode.Machine White</property>
+                            <signal name="activate" handler="MachineBlackProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkRadioMenuItem" id="menuMode.Two Machines">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Two Machines</property>
+                            <property name="use_underline">True</property>
+                            <property name="draw_as_radio">True</property>
+                            <property name="group">menuMode.Machine White</property>
+                            <signal name="activate" handler="TwoMachinesProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkRadioMenuItem" id="menuMode.Analyze Mode">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Analyze Mode</property>
+                            <property name="use_underline">True</property>
+                            <property name="draw_as_radio">True</property>
+                            <property name="group">menuMode.Machine White</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkRadioMenuItem" id="menuMode.Analyze File">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Analyze File</property>
+                            <property name="use_underline">True</property>
+                            <property name="draw_as_radio">True</property>
+                            <property name="group">menuMode.Machine White</property>
+                            <signal name="toggled" handler="AnalyzeFileProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkRadioMenuItem" id="menuMode.ICS Client">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">ICS Client</property>
+                            <property name="use_underline">True</property>
+                            <property name="draw_as_radio">True</property>
+                            <property name="group">menuMode.Machine White</property>
+                            <signal name="activate" handler="IcsClientProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkRadioMenuItem" id="menuMode.Edit Game">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Edit Game</property>
+                            <property name="use_underline">True</property>
+                            <property name="draw_as_radio">True</property>
+                            <property name="group">menuMode.Machine White</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkRadioMenuItem" id="menuMode.Edit Position">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Edit Position</property>
+                            <property name="use_underline">True</property>
+                            <property name="draw_as_radio">True</property>
+                            <property name="group">menuMode.Machine White</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkRadioMenuItem" id="menuMode.Training">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Training</property>
+                            <property name="use_underline">True</property>
+                            <property name="draw_as_radio">True</property>
+                            <property name="group">menuMode.Machine White</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkSeparatorMenuItem" id="menuModeSep1">
+                            <property name="visible">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuMode.Show Game List">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Show Game List</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuMode.Show Move List">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Show Move List</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="HistoryShowProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuMode.Edit Tags">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Edit Tags</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="EditTagsProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuMode.Edit Comments">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Edit Comments</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuMode.ICS Input Box">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">ICS Input Box</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuMode.Pause">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Pause</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkMenuItem" id="MenuItemAction">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">_Action</property>
+                    <property name="use_underline">True</property>
+                    <child type="submenu">
+                      <object class="GtkMenu" id="menu1">
+                        <property name="visible">True</property>
+                        <child>
+                          <object class="GtkMenuItem" id="menuAction.Accept">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Accept</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="AcceptProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuAction.Decline">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Decline</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="DeclineProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuAction.Rematch">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Rematch</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="RematchProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkSeparatorMenuItem" id="menuActionsep1">
+                            <property name="visible">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuAction.Call Flag">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Call Flag</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="CallFlagProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuAction.Draw">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Draw</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="DrawProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuAction.Adjourn">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Adjourn</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="AdjournProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuAction.Abort">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Abort</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="AbortProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuAction.Resign">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Resign</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="ResignProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkSeparatorMenuItem" id="menuActionsep2">
+                            <property name="visible">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuAction.Stop Observing">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Stop Observing</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuAction.Stop Examining">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Stop Examine</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkSeparatorMenuItem" id="menuActionsep3">
+                            <property name="visible">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuAction.Adjucate to White">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Adjucate to White</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="AdjuWhiteProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuAction.Adjucate to Black">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Adjucate to Black</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="AdjuBlackProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuAction.Adjucate Draw">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Adjucate Draw</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="AdjuDrawProc"/>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkMenuItem" id="MenuItemStep">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">_Step</property>
+                    <property name="use_underline">True</property>
+                    <child type="submenu">
+                      <object class="GtkMenu" id="menu4">
+                        <property name="visible">True</property>
+                        <child>
+                          <object class="GtkMenuItem" id="menuStep.Backward">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Backward</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="BackwardProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuStep.Foward">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Forward</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="ForwardProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuStep.Back To Start">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Back to Start</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="ToStartProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuStep.Forward To End">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Forward to End</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="ToEndProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuStep.Revert">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Revert</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="RevertProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuStep.Truncate Game">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Truncate Game</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="TruncateGameProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkSeparatorMenuItem" id="MenuStepSep1">
+                            <property name="visible">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuStep.Move Now">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Move now</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="MoveNowProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuStep.Retract Move">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Retract Move</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="RetractMoveProc"/>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkMenuItem" id="MenuItemOptions">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">_Options</property>
+                    <property name="use_underline">True</property>
+                    <child type="submenu">
+                      <object class="GtkMenu" id="menu5">
+                        <property name="visible">True</property>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Always Queen">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Always Queen</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="AlwaysQueenProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Animate Dragging">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Animate Dragging</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="AnimateDraggingProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Animate Moving">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Animate Moving</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="AnimateMovingProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Auto Comment">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Auto Comment</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Auto Flag">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Auto Flag</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Auto Flip View">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Auto Flip View</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Auto Observe">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Auto Observe</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="AutobsProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Auto Raise Board">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Auto Raise Board</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="AutoraiseProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Auto Save">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Auto Save</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="AutosaveProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Blindfold">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Blindfold</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="BlindfoldProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Flash Moves">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Flash Moves</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="FlashMovesProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Flip View">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Flip View</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="FlipViewProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Get Move List">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Get Move List</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="GetMoveListProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Highlight Last Move">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Highlight Last Move</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="HighlightLastMoveProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Move Sound">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Move Sound</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="MoveSoundProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.ICS Alarm">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">ICS Alarm</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="IcsAlarmProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Old Save Style">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Old Save Style</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="OldSaveStyleProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Periodic Updates">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Periodic Updates</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="PeriodicUpdatesProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Ponder Next Move">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Ponder Next Move</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Popup Exit Message">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Popup Exit Message</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Popup Move Errors">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Popup Move Errors</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Premove">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Premove</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Quiet Play">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Quiet Play</property>
+                            <property name="use_underline">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Show Coords">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Show Coords</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="ShowCoordsProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Show Thinking">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Show Thinking</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="HideThinkingProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkCheckMenuItem" id="menuOptions.Test Legality">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Test Legality</property>
+                            <property name="use_underline">True</property>
+                            <signal name="toggled" handler="TestLegalityProc"/>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkMenuItem" id="MenuItemHelp">
+                    <property name="visible">True</property>
+                    <property name="label" translatable="yes">_Help</property>
+                    <property name="use_underline">True</property>
+                    <child type="submenu">
+                      <object class="GtkMenu" id="menu3">
+                        <property name="visible">True</property>
+                        <child>
+                          <object class="GtkMenuItem" id="menuHelp.man">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Man XBoard</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="ManProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuHelp.Info">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Info XBoard</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="InfoProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuHelp.Hint">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Hint</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="HintProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkMenuItem" id="menuHelp.Book">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Book</property>
+                            <property name="use_underline">True</property>
+                            <signal name="activate" handler="BookProc"/>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkSeparatorMenuItem" id="menuHelpsep1">
+                            <property name="visible">True</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkImageMenuItem" id="menuHelp.about">
+                            <property name="label">gtk-about</property>
+                            <property name="visible">True</property>
+                            <property name="use_underline">True</property>
+                            <property name="use_stock">True</property>
+                            <signal name="activate" handler="AboutProc"/>
+                          </object>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="Timer">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkEventBox" id="WhiteClockEventBox">
+                    <property name="visible">True</property>
+                    <signal name="button_press_event" handler="WhiteClockProc"/>
+                    <child>
+                      <object class="GtkLabel" id="WhiteClock">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">White:</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEventBox" id="BlackClockEventBox">
+                    <property name="visible">True</property>
+                    <signal name="button_press_event" handler="BlackClockProc"/>
+                    <child>
+                      <object class="GtkLabel" id="BlackClock">
+                        <property name="visible">True</property>
+                        <property name="label" translatable="yes">Black:</property>
+                      </object>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkHBox" id="ButtonBar">
+                <property name="visible">True</property>
+                <child>
+                  <object class="GtkLabel" id="Messages">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">not your turn</property>
+                    <property name="single_line_mode">True</property>
+                  </object>
+                  <packing>
+                    <property name="position">0</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="buttonbar.ToStart">
+                    <property name="label" translatable="yes">&lt;&lt;</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <signal name="activate" handler="ToStartProc"/>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">1</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="buttonbar.Backward">
+                    <property name="label" translatable="yes">&lt;</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <signal name="activate" handler="BackwardProc"/>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="buttonbar.Pause">
+                    <property name="label" translatable="yes">P</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <signal name="activate" handler="PauseProc"/>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">3</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="buttonbar.Forward">
+                    <property name="label" translatable="yes">&gt;</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">4</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkButton" id="buttonbar.ToEnd">
+                    <property name="label" translatable="yes">&gt;&gt;</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <signal name="activate" handler="ToEndProc"/>
+                  </object>
+                  <packing>
+                    <property name="expand">False</property>
+                    <property name="fill">False</property>
+                    <property name="position">5</property>
+                  </packing>
+                </child>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkDrawingArea" id="Board">
+                <property name="visible">True</property>
+                <property name="events">GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK | GDK_STRUCTURE_MASK</property>
+                <signal name="button_press_event" handler="UserMoveProc"/>
+                <signal name="expose_event" handler="EventProc"/>
+                <signal name="button_release_event" handler="UserMoveProc"/>
+              </object>
+              <packing>
+                <property name="fill">False</property>
+                <property name="position">3</property>
+              </packing>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+  </object>
+  <object class="GtkImage" id="image1">
+    <property name="visible">True</property>
+    <property name="xalign">0.40000000596046448</property>
+    <property name="stock">gtk-open</property>
+  </object>
+  <object class="GtkImage" id="image2">
+    <property name="visible">True</property>
+    <property name="stock">gtk-save</property>
+    <property name="icon-size">1</property>
+  </object>
+  <object class="GtkDialog" id="EditTags">
+    <property name="border_width">5</property>
+    <property name="type_hint">normal</property>
+    <property name="has_separator">False</property>
+    <child internal-child="vbox">
+      <object class="GtkVBox" id="EditTags-vbox">
+        <property name="visible">True</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">2</property>
+        <child>
+          <object class="GtkVBox" id="EditTagsTextArea">
+            <property name="visible">True</property>
+            <property name="orientation">vertical</property>
+            <child>
+              <placeholder/>
+            </child>
+          </object>
+          <packing>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child internal-child="action_area">
+          <object class="GtkHButtonBox" id="EditTagsActionArea">
+            <property name="visible">True</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="Edit">
+                <property name="label" translatable="yes">gtk-edit</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="Cancel">
+                <property name="label" translatable="yes">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+                <signal name="released" handler="EditTagsHideProc"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">False</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="pack_type">end</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+    <action-widgets>
+      <action-widget response="0">Edit</action-widget>
+      <action-widget response="0">Cancel</action-widget>
+    </action-widgets>
+  </object>
+</interface>
diff --git a/interface.c b/interface.c
new file mode 100644 (file)
index 0000000..e1a2069
--- /dev/null
@@ -0,0 +1,102 @@
+#include "config.h"
+
+#include <stdio.h>
+#include <ctype.h>
+#include <signal.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <pwd.h>
+
+#include <gtk/gtk.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+#include "common.h"
+#include "frontend.h"
+#include "backend.h"
+#include "moves.h"
+#include "xboard.h"
+#include "childio.h"
+#include "xgamelist.h"
+#include "xhistory.h"
+#include "xedittags.h"
+#include "gettext.h"
+#include "callback.h"
+
+#ifdef ENABLE_NLS
+# define  _(s) gettext (s)
+# define N_(s) gettext_noop (s)
+#else
+# define  _(s) (s)
+# define N_(s)  s
+#endif
+
+extern GtkWidget *GUI_Window;
+
+
+GdkPixbuf *load_pixbuf(char *filename,int size)
+{
+  GdkPixbuf *image;
+
+  if(size)
+    image = gdk_pixbuf_new_from_file_at_size(filename,size,size,NULL);
+  else
+    image = gdk_pixbuf_new_from_file(filename,NULL);
+  
+  if(image == NULL)
+    {
+      fprintf(stderr,_("Error: couldn't load file: %s\n"),filename);
+      exit(1);
+    }
+  return image;
+}
+
+void
+FileNamePopUp(label, def, proc, openMode)
+     char *label;
+     char *def;
+     FileProc proc;
+     char *openMode;
+{
+  /* TODO:
+   *   implement look for certain file types
+   *   use save/load button depending on what function is calling
+   */
+
+  GtkWidget *dialog;
+
+  dialog = gtk_file_chooser_dialog_new (label,
+                                       GTK_WINDOW(GUI_Window),
+                                       GTK_FILE_CHOOSER_ACTION_OPEN,
+                                       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                       GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+                                       NULL);
+  if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
+    {
+      char *filename;
+      FILE *f;
+
+      filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+
+      //see loadgamepopup
+      f = fopen(filename, openMode);
+      if (f == NULL) 
+       {
+         DisplayError(_("Failed to open file"), errno);
+       }
+      else 
+       {
+         printf( "DEBUG: before call\n");
+         /* TODO add indec */
+         (*proc)(f, 0, filename);
+         printf( "DEBUG: after call\n");
+       }
+      g_free (filename);
+    };
+  
+  gtk_widget_destroy (dialog);
+  ModeHighlight();
+  
+  return;
+
+}
diff --git a/interface.h b/interface.h
new file mode 100644 (file)
index 0000000..38db60d
--- /dev/null
@@ -0,0 +1,37 @@
+/* GTK widgets */
+GtkBuilder              *builder=NULL;
+
+GtkWidget               *GUI_Window=NULL;
+GtkWidget               *GUI_Aspect=NULL;
+GtkWidget               *GUI_History=NULL;
+GtkWidget               *GUI_Board=NULL;
+GtkWidget               *GUI_Whiteclock=NULL;
+GtkWidget               *GUI_Blackclock=NULL;
+GtkWidget               *GUI_Error=NULL;
+GtkWidget               *GUI_Menubar=NULL;
+GtkWidget               *GUI_Timer=NULL;
+GtkWidget               *GUI_Buttonbar=NULL;
+GtkWidget               *GUI_EditTags=NULL;
+GtkWidget               *GUI_EditTagsTextArea=NULL;
+
+GtkListStore            *LIST_MoveHistory=NULL;
+
+gint                     boardWidth;
+gint                     boardHeight;
+
+
+GdkPixbuf               *WindowIcon=NULL;
+GdkPixbuf               *WhiteIcon=NULL;
+GdkPixbuf               *BlackIcon=NULL;
+#define MAXPIECES 100
+GdkPixbuf               *SVGpieces[MAXPIECES];
+GdkPixbuf               *SVGLightSquare=NULL;
+GdkPixbuf               *SVGDarkSquare=NULL;
+GdkPixbuf               *SVGNeutralSquare=NULL;
+
+GdkCursor               *BoardCursor=NULL;
+
+
+GdkPixbuf *load_pixbuf P((char *filename,int size));
+void FileNamePopUp P((char *label, char *def,
+                     FileProc proc, char *openMode));
diff --git a/svg/BlackBishop.svg b/svg/BlackBishop.svg
new file mode 100644 (file)
index 0000000..bd92057
--- /dev/null
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="97.221024"
+   height="89.91935"
+   id="svg2833"
+   sodipodi:version="0.32"
+   inkscape:version="0.46+devel"
+   version="1.0"
+   sodipodi:docname="BlackBishop.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2835">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2841" />
+    <inkscape:perspective
+       id="perspective2851"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2873"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2916"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2959"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3002"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.98994949"
+     inkscape:cx="8.7527877"
+     inkscape:cy="82.430952"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="658"
+     inkscape:window-height="834"
+     inkscape:window-x="564"
+     inkscape:window-y="56" />
+  <metadata
+     id="metadata2838">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-67.582896,-63.246303)">
+    <path
+       style="stroke-width:1px"
+       d="m 111.74636,137.63153 c -7.7414,2.97746 -12.505341,2.97746 -20.842231,2.97746 -5.35943,0 -11.90985,-0.59549 -16.67379,2.97747 -2.38196,2.38196 1.78648,8.33689 4.16845,8.33689 2.97746,0.59549 5.95493,-1.78648 8.93239,-1.78648 6.55041,-0.59549 12.50534,1.78648 19.055751,0 2.97746,-0.59549 6.55042,-3.57295 9.52787,-3.57295 2.97746,0 7.14591,2.97746 10.12337,3.57295 4.76394,1.19099 9.52788,0 14.29182,0 4.16844,0 10.71886,2.97747 14.29181,1.78648 1.78648,-0.59549 4.76394,-4.76394 4.16845,-7.14591 -0.59549,-2.97746 -7.14591,-3.57295 -9.52788,-4.16845 -10.71886,-1.19098 -19.05575,2.97747 -28.58363,-3.57295 2.97746,0 16.67378,0 16.67378,-4.16846 0.5955,-4.16844 -4.16844,-8.33689 -2.97746,-13.10083 0.5955,-4.76394 4.76394,-8.33689 5.95493,-13.69632 2.97746,-13.69633 -8.3369,-23.8197 -19.65125,-29.17913 1.19098,-1.78647 2.38197,-4.16844 2.38197,-6.55041 -0.59549,-8.93239 -14.8873,-7.7414 -13.69632,1.19098 0.59549,1.78648 1.78648,3.57296 2.38197,5.35943 -11.31435,5.35943 -22.628711,15.4828 -19.651241,29.17913 1.19098,5.35943 5.35943,8.93238 5.95492,13.69632 1.19098,4.76394 -3.57296,8.93239 -2.97746,13.10083 0,4.16846 13.696321,4.16846 16.673781,4.16846 l 0,0.59549 z m 20.24673,-9.52789 c -0.59549,1.78648 -5.35943,0.5955 -6.55041,0.5955 -6.55042,-0.5955 -13.10083,-0.5955 -19.65124,0 -1.19099,0 -5.954921,1.19098 -5.35943,-1.19099 0.59549,-2.38197 4.16844,-2.38197 5.95492,-2.38197 6.55042,-0.59549 12.50533,-0.59549 19.05575,0 1.78648,0 7.14591,0 6.55041,2.97746 z m -2.97746,-10.12337 c 0,2.38197 -3.57295,1.78648 -4.76394,1.78648 -5.35943,-0.59549 -10.71885,-0.59549 -16.07828,0 -1.19099,0 -4.16845,0.59549 -4.76394,-1.19098 0,-2.38197 4.16845,-2.38197 5.35943,-2.38197 5.35943,-0.5955 9.52787,-0.5955 14.8873,0 1.19099,0 4.76394,0 5.35943,1.78647 z M 117.70128,97.73353 c 8.33689,0 8.33689,3.57296 0,3.57296 0,8.33689 -3.57295,8.33689 -3.57295,0 -7.7414,0 -7.7414,-3.57296 0,-3.57296 0,-8.33689 3.57295,-8.33689 3.57295,0 z"
+       id="BlackBishop" />
+  </g>
+</svg>
diff --git a/svg/BlackKing.svg b/svg/BlackKing.svg
new file mode 100644 (file)
index 0000000..952e36a
--- /dev/null
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="97.221024"
+   height="89.91935"
+   id="svg2833"
+   sodipodi:version="0.32"
+   inkscape:version="0.46+devel"
+   version="1.0"
+   sodipodi:docname="BlackKing.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2835">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2841" />
+    <inkscape:perspective
+       id="perspective2851"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2873"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2916"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.98994949"
+     inkscape:cx="8.7527877"
+     inkscape:cy="82.430952"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="658"
+     inkscape:window-height="834"
+     inkscape:window-x="439"
+     inkscape:window-y="68" />
+  <metadata
+     id="metadata2838">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-67.582896,-63.246303)">
+    <path
+       style="stroke-width:1px"
+       d="m 107.0078,95.030707 c -4.16845,-2.38197 -8.336892,-4.76394 -13.100832,-5.35943 -10.71886,-1.19099 -23.2242,6.55041 -21.43773,19.055753 1.78648,8.93239 10.71887,11.31436 13.69633,18.46027 2.38197,4.76394 -1.19099,14.29182 2.38197,17.86477 1.78647,2.38197 7.1459,2.97746 10.12337,4.16845 10.718862,2.38197 22.628702,2.38197 33.347562,0 3.57295,-0.5955 9.52788,-1.19099 11.90985,-4.16845 4.16845,-3.57295 -0.5955,-13.69632 2.38196,-18.46026 4.16846,-6.55042 12.50535,-9.52789 13.69633,-18.46027 1.19099,-11.909853 -10.71886,-19.651253 -21.43773,-18.460263 -4.76393,0.59549 -8.93237,2.97746 -13.10083,5.35943 l -1.19098,-10.12337 -5.95493,-5.35943 -0.59549,-7.145914 c 5.35944,0 5.35944,-2.97746 0,-2.97746 0,-5.35943 -2.97746,-5.35943 -2.97746,0 -5.35942,0 -5.35942,2.97746 0,2.97746 l -0.59548,7.145914 -5.95493,5.35943 z m 10.71885,24.415183 c 0,-13.10083 8.93239,-26.201663 22.62872,-26.797153 11.90984,-0.59549 20.24674,10.123373 14.29181,20.842233 -2.38197,4.16845 -8.93238,11.31436 -13.69632,12.50535 -3.57295,0.59549 -7.7414,-1.78648 -11.31435,-1.78648 -6.55042,-1.19099 -13.10083,-1.78648 -19.65125,-1.19099 -5.35943,0.5955 -14.291822,4.16845 -19.055752,2.38197 -7.14591,-2.38197 -17.26928,-13.10083 -14.88731,-21.43773 2.38197,-11.314353 16.07829,-13.100833 25.010682,-8.932383 8.93238,4.76394 13.69632,14.291813 13.69632,24.415183 l 2.97746,0 z m -26.201652,3.57296 c 4.76394,-1.19098 9.527882,-2.38197 14.291812,-2.97746 1.78648,0 4.16844,0.59549 5.35943,-1.19099 1.78648,-1.78648 -0.59549,-7.7414 -1.78647,-10.12337 -3.57296,-7.7414 -10.718862,-13.100833 -19.651252,-12.505343 -8.33689,0.5955 -13.69632,8.932393 -8.33689,16.673793 2.38197,4.16844 7.14591,5.95492 10.12337,10.12337 z m 0.59549,11.31436 c 0.59549,-2.38197 7.14591,-2.97746 8.932392,-2.97746 9.52787,-1.78648 19.65124,-2.38197 29.17912,-0.5955 1.78647,0.5955 10.71885,1.19099 10.12336,4.16845 -0.59549,2.97746 -8.93239,-0.59549 -10.71885,-0.59549 -9.52789,-1.78648 -20.24674,-1.78648 -29.774622,0.59549 -1.19098,0 -8.33689,2.38197 -7.7414,-0.59549 z m 0,7.7414 c 0.59549,-2.38197 7.14591,-2.97746 8.932392,-3.57296 9.52787,-2.38197 19.65124,-2.38197 29.17912,-0.59549 1.78647,0.59549 10.71885,1.78648 10.12336,4.76394 -0.59549,2.97746 -8.93239,-0.59549 -10.71885,-1.19098 -9.52789,-1.78648 -20.24674,-1.78648 -29.774622,0.59549 -1.19098,0.59549 -8.33689,3.57295 -7.7414,0 z m 23.819692,-33.94307 c -1.78647,-2.97746 -2.97746,-5.95492 -4.76394,-8.932383 -1.78647,-4.76394 -1.78647,-20.24674 7.7414,-15.4828 8.3369,4.16844 1.78648,19.651243 -2.97746,24.415183 z m 0.5955,-5.95492 c 0.59549,-1.78648 1.78647,-4.168453 2.38196,-5.954933 0.5955,-2.38197 1.19099,-12.50533 -4.16844,-9.52787 -4.76395,2.97746 -0.59549,12.50534 1.78648,15.482803 z m 24.41518,20.84223 c 2.97746,-4.16845 7.7414,-5.95493 10.12337,-10.12337 5.35943,-7.7414 0,-16.078293 -8.33689,-16.673793 -8.93239,-0.59549 -16.0783,4.763943 -19.65125,12.505343 -1.19098,2.38197 -3.57295,8.33689 -1.78648,10.12337 1.19099,1.78648 3.57296,1.19099 5.35943,1.19099 4.76394,0.59549 9.52788,1.78648 14.29182,2.97746 z"
+       id="BlackKing" />
+  </g>
+</svg>
diff --git a/svg/BlackKnight.svg b/svg/BlackKnight.svg
new file mode 100644 (file)
index 0000000..c8022fd
--- /dev/null
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="97.221024"
+   height="89.91935"
+   id="svg2833"
+   sodipodi:version="0.32"
+   inkscape:version="0.46+devel"
+   version="1.0"
+   sodipodi:docname="BlackKnight.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2835">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2841" />
+    <inkscape:perspective
+       id="perspective2851"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2873"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2916"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2959"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3002"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3045"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.98994949"
+     inkscape:cx="8.7527877"
+     inkscape:cy="82.430952"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="658"
+     inkscape:window-height="834"
+     inkscape:window-x="564"
+     inkscape:window-y="56" />
+  <metadata
+     id="metadata2838">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-67.582896,-63.246303)">
+    <path
+       style="stroke-width:1px"
+       d="m 127.85934,74.725837 c -2.38197,-1.78647 -4.76394,-8.33689 -7.7414,-8.93238 -3.57296,-0.59549 -4.76394,7.14591 -7.7414,8.33689 -4.76394,1.78648 -9.52788,1.78648 -14.291841,4.76394 -14.8873,9.52788 -19.65124,27.988143 -22.03321,44.066433 -1.19099,6.55042 -1.78648,13.10083 -1.78648,19.65125 0,1.78648 -0.59549,5.35943 0.59549,6.55041 1.78648,2.38198 10.71887,1.19099 13.69633,1.19099 h 35.729551 c 4.16845,0 11.31436,1.78648 10.71886,-4.76394 -2.97746,-14.88731 -20.24673,-21.43772 -20.84223,-36.92052 5.35943,4.16844 11.90985,5.95492 16.67379,10.12337 3.57295,2.97746 6.55041,8.93238 10.12337,11.31435 2.38197,1.19098 4.76394,0 5.95492,-2.38197 5.95492,1.78648 11.90985,-2.38197 11.31435,-8.93238 -0.59549,-7.74141 -5.95492,-13.69633 -9.52787,-20.246753 -2.38197,-4.16844 -1.78648,-8.33689 -3.57296,-12.50533 -1.19098,-2.97747 -4.16844,-4.76394 -5.35943,-7.7414 -1.78647,-2.38197 2.38197,-9.52788 -0.59549,-11.90985 -2.97746,-2.38197 -10.12337,5.95492 -11.31435,8.33689 z m -12.50534,2.97746 c -1.78648,3.57296 -5.35943,2.97747 -8.33689,4.76394 -4.16845,1.19099 -7.145931,4.76394 -10.123391,7.7414 -8.93239,11.314363 -13.10083,29.179133 -13.10083,43.470943 0,5.35943 1.19098,13.69633 -5.95492,13.69633 0,-19.65125 1.78647,-42.27996 14.8873,-58.358253 4.76394,-5.95493 14.291841,-13.10083 22.628731,-11.31436 z m 30.9656,47.639393 -1.78648,0.59549 -1.78648,-5.95492 h 0.5955 z m 4.16844,-5.95492 c -2.97746,-0.59549 -4.16844,-5.35943 -0.59549,-5.35943 2.97746,0 3.57296,5.95492 0.59549,5.35943 z m -36.32503,-13.10083 h -1.19098 l -1.78648,-6.550423 c 2.38197,1.190983 2.97746,4.168453 2.97746,6.550423 z m 25.01068,-10.718873 -1.19098,-2.97746 c -3.57296,0.59549 -5.35943,-1.19098 -4.76394,-4.76394 l -2.97746,-0.59549 v -0.59549 c 5.35943,-1.19099 10.12337,3.57295 8.93238,8.93238 z m -4.76394,-13.10083 c -1.19098,0 -2.97746,0 -4.16844,-0.59549 -11.31436,-3.57295 2.97746,-5.95492 4.16844,0.59549 z"
+       id="BlackKnight" />
+  </g>
+</svg>
diff --git a/svg/BlackPawn.svg b/svg/BlackPawn.svg
new file mode 100644 (file)
index 0000000..f53bbf9
--- /dev/null
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="97.221024"
+   height="89.91935"
+   id="svg2833"
+   sodipodi:version="0.32"
+   inkscape:version="0.46+devel"
+   version="1.0"
+   sodipodi:docname="BlackPawn.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2835">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2841" />
+    <inkscape:perspective
+       id="perspective2851"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2873"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2916"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2959"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3002"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3045"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3088"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.98994949"
+     inkscape:cx="8.7527877"
+     inkscape:cy="82.430952"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="658"
+     inkscape:window-height="834"
+     inkscape:window-x="564"
+     inkscape:window-y="56" />
+  <metadata
+     id="metadata2838">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-67.582896,-63.246303)">
+    <path
+       style="stroke-width:1px"
+       d="m 107.6261,86.227321 c -1.78648,-4.76394 -4.16845,-9.52787 0,-14.29181 5.35943,-6.55042 18.46025,-4.16845 19.65123,4.76394 0.5955,3.57295 -1.19098,6.55041 -2.38196,9.52787 13.69632,2.97746 9.52787,19.055759 4.16844,26.797159 10.12337,2.97746 15.4828,14.29182 17.26928,23.81969 0,2.38197 1.78648,8.33689 -0.59549,10.12337 -2.38197,2.38197 -10.71887,0.59549 -14.29182,0.59549 l -30.3701,0 c -4.168442,0 -9.527872,1.19099 -13.696322,0 -3.57295,-1.19098 -1.19098,-8.33689 -1.19098,-10.71886 1.78647,-9.52787 7.1459,-20.84223 17.269272,-23.81969 -5.359432,-7.7414 -9.527872,-23.819699 4.16845,-26.797159 z"
+       id="BlackPawn" />
+  </g>
+</svg>
diff --git a/svg/BlackQueen.svg b/svg/BlackQueen.svg
new file mode 100644 (file)
index 0000000..d0bf286
--- /dev/null
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="97.221024"
+   height="89.91935"
+   id="svg2833"
+   sodipodi:version="0.32"
+   inkscape:version="0.46+devel"
+   version="1.0"
+   sodipodi:docname="BlackQueen.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2835">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2841" />
+    <inkscape:perspective
+       id="perspective2851"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2873"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.98994949"
+     inkscape:cx="50.852927"
+     inkscape:cy="82.430952"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="658"
+     inkscape:window-height="834"
+     inkscape:window-x="439"
+     inkscape:window-y="68" />
+  <metadata
+     id="metadata2838">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-67.582896,-63.246303)">
+    <path
+       style="stroke-width:1px"
+       d="m 90.962864,109.09922 c -2.97746,-7.7414 -8.93239,-13.696323 -11.31436,-21.437727 -1.19098,-3.57296 1.78648,-6.55042 -0.59549,-10.12337 -1.78648,-2.97747 -6.55041,-4.16845 -9.52788,-1.19099 -5.95492,6.55042 3.57296,8.93239 4.76394,13.10083 3.57296,8.932394 2.38197,19.651257 5.95493,28.583647 1.19098,3.57294 4.16845,5.95491 5.95492,8.93237 1.78648,2.38197 2.97746,7.14591 1.19099,10.12337 -1.19099,2.97747 -5.35944,7.14591 -2.97746,10.71887 2.38196,3.57295 10.12336,2.97746 14.291808,3.57295 13.696328,1.78648 33.943068,3.57296 47.043898,-1.78648 7.14591,-2.97746 -1.78648,-12.50534 -0.59549,-18.46026 1.19098,-5.35943 5.95492,-8.33689 7.7414,-13.69632 2.38197,-8.93238 1.78648,-19.055753 5.35943,-27.988147 1.19098,-3.57295 5.95492,-3.57295 6.55042,-8.33689 0,-7.14591 -10.12337,-8.93238 -12.50534,-1.78648 -0.5955,2.97746 1.78647,5.35943 1.19098,7.7414 -1.78648,7.14591 -8.33689,16.078307 -12.50534,22.033227 l -1.78647,-30.370117 c 7.7414,-3.57295 5.35943,-15.4828 -2.97747,-11.90985 -2.38196,0.5955 -4.16844,3.57296 -4.16844,6.55042 0.59549,2.38197 2.97746,3.57295 2.97746,5.95492 -0.59549,9.52788 -8.33689,19.055764 -9.52788,28.583637 h -0.59549 c -1.19098,-10.123373 -5.95492,-20.246737 -5.95492,-30.370107 0,-2.97747 3.57295,-4.76394 3.57295,-8.3369 0,-2.97746 -2.97746,-5.95492 -5.95492,-5.95492 -3.57295,0 -6.55042,2.38197 -6.55042,5.95492 0,3.57296 3.57296,5.35943 3.57296,8.3369 0,10.12337 -4.76394,20.246734 -5.95492,30.370107 h -0.5955 c -1.19098,-9.527873 -8.932388,-19.055757 -9.527878,-28.583637 0,-2.38197 2.38197,-3.57295 2.977458,-5.95492 0,-2.97746 -1.190988,-5.95492 -4.168446,-6.55042 -8.33689,-3.57295 -10.71886,8.3369 -2.97746,11.90985 l -1.78648,30.370117 h -0.59549 z m 52.998816,32.15658 c 1.19099,0 1.19099,2.38197 0,2.38197 -1.19098,0 -1.19098,-2.38197 0,-2.38197 z m -51.212336,-4.76394 c -4.16845,-1.78648 5.954918,-3.57295 7.145908,-3.57295 10.123368,-1.19099 20.246738,-1.78648 30.370108,-0.59549 2.38197,0.59549 7.7414,0 9.52788,2.38196 2.97746,2.97747 -4.76394,1.78648 -5.95492,1.78648 -8.3369,-1.19098 -17.86477,-1.78648 -26.20166,-1.19098 -3.57296,0.59549 -11.314366,2.97746 -14.887316,1.19098 z m -1.19099,-8.93238 c -4.76394,-1.19099 5.35943,-4.16845 6.550418,-4.16845 11.314358,-1.19098 22.033218,-1.78648 33.347578,0 2.38197,0 8.33689,0 10.12337,2.38197 2.38196,2.97746 -7.14591,1.19098 -8.3369,1.19098 -8.33689,-1.19098 -17.26927,-1.78647 -25.60616,-1.19098 -4.16845,0.59549 -11.909856,2.97746 -16.078306,1.78648 z"
+       id="BlackQueen" />
+  </g>
+</svg>
diff --git a/svg/BlackRook.svg b/svg/BlackRook.svg
new file mode 100644 (file)
index 0000000..47eaf85
--- /dev/null
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="97.221024"
+   height="89.91935"
+   id="svg2833"
+   sodipodi:version="0.32"
+   inkscape:version="0.46+devel"
+   version="1.0"
+   sodipodi:docname="BackRook.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2835">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2841" />
+    <inkscape:perspective
+       id="perspective2851"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2873"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2916"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2959"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.98994949"
+     inkscape:cx="8.7527877"
+     inkscape:cy="82.430952"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="658"
+     inkscape:window-height="834"
+     inkscape:window-x="564"
+     inkscape:window-y="56" />
+  <metadata
+     id="metadata2838">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-67.582896,-63.246303)">
+    <path
+       style="stroke-width:1px"
+       d="m 86.628289,138.26863 c -1.78648,0 -4.763941,-0.5955 -5.954931,0.59549 -1.78647,1.19098 -1.78647,7.7414 0,8.33689 4.168451,2.38197 13.100831,0.59549 17.864771,0.59549 h 35.729541 c 4.76394,0 11.90985,1.19099 16.67379,0 2.38197,-1.19098 2.97746,-7.1459 0.59549,-8.93238 -1.19099,-1.19099 -4.16845,-0.59549 -5.95492,-0.59549 0,-2.97747 0.59549,-6.55042 -0.5955,-8.93239 -1.19098,-2.97746 -4.76393,-4.16844 -5.95492,-7.7414 -1.78648,-7.7414 -0.59549,-20.24674 0,-27.988142 0.59549,-4.16844 5.35943,-5.95492 7.14591,-8.93238 2.38197,-2.97746 1.78648,-11.31435 1.19098,-14.29182 -1.19098,-2.97746 -11.90984,-2.97746 -13.69632,-1.19098 -1.78648,1.19098 -1.19098,4.16845 -1.19098,5.95492 h -8.93239 c 0,-1.78647 0.59549,-4.16844 -0.59549,-5.35943 -1.19099,-1.78648 -12.50534,-1.78648 -13.69633,0 -1.19098,1.19099 -0.59549,3.57296 -0.59549,5.35943 h -8.932381 c 0,-1.78647 0.595491,-4.76394 -1.19099,-5.95492 -1.78647,-1.78648 -12.50533,-1.78648 -13.69632,1.19098 -0.59549,2.97747 -1.190982,11.31436 1.19099,14.29182 1.78647,2.97746 6.55041,4.76394 7.1459,8.93238 0.59549,7.741402 1.78648,20.246742 0,27.988142 -1.19098,3.57296 -4.76394,4.76394 -5.95492,7.7414 -1.19098,2.38197 -0.59549,5.95492 -0.59549,8.93239 z m 4.16844,2.97746 c -1.78647,-0.59549 -0.59549,-2.38197 1.19099,-2.97746 11.909841,-1.78648 25.010681,0 36.920521,0 2.97746,0 10.12337,-1.19099 12.50534,0.59549 4.16845,2.97746 -8.33689,2.97746 -9.52788,2.97746 h -29.17912 c -2.977461,0 -8.932391,1.19098 -11.909851,-0.59549 z m 1.78648,-10.12337 c -4.76394,-1.78648 5.35943,-2.97746 6.55042,-2.97746 h 29.774611 c 2.38197,0 9.52788,-1.19099 11.31436,1.19098 2.97746,2.97746 -8.93239,2.38197 -10.12337,2.38197 h -26.20167 c -2.97746,0 -8.336891,1.19099 -11.314351,-0.59549 z m 4.76394,-6.55042 c -1.78648,-0.59549 -1.19099,-2.38197 0.59549,-2.97746 8.336891,-2.38197 20.246741,0 28.583631,0 2.38197,0 7.7414,-1.19098 8.93239,1.19099 2.38197,2.97746 -6.55042,2.38197 -7.7414,2.38197 h -20.84223 c -2.97747,0 -7.145911,0.59549 -9.527881,-0.5955 z m 0,-32.752072 c -1.78648,-0.5955 -1.19099,-2.38197 0.59549,-2.97746 8.336891,-2.38197 20.246741,0 28.583631,0 2.38197,0 7.7414,-1.19099 8.93239,1.19098 2.38197,2.97746 -6.55042,2.38197 -7.7414,2.38197 h -20.84223 c -2.97747,0 -7.145911,0.59549 -9.527881,-0.59549 z m -7.14591,-7.7414 c -1.78648,-0.5955 -0.59549,-2.38197 1.19099,-2.97746 11.909841,-1.78648 26.201661,0 38.111501,0 2.97747,0 10.12337,-1.19099 12.50534,0.59549 4.16845,2.97746 -8.33689,2.97746 -9.52787,2.97746 h -29.77462 c -3.572951,0 -9.527881,1.19098 -12.505341,-0.59549 z"
+       id="BlackRook" />
+  </g>
+</svg>
diff --git a/svg/DarkSquare.svg b/svg/DarkSquare.svg
new file mode 100644 (file)
index 0000000..5c934c6
--- /dev/null
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="100"
+   height="100"
+   id="svg2"
+   inkscape:version="0.46+devel r21645"
+   sodipodi:docname="DarkSquare.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <metadata
+     id="metadata127">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="790"
+     inkscape:window-height="813"
+     id="namedview125"
+     showgrid="false"
+     inkscape:zoom="2.58"
+     inkscape:cx="62.015504"
+     inkscape:cy="44.96124"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 50 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="100 : 50 : 1"
+       inkscape:persp3d-origin="50 : 33.333333 : 1"
+       id="perspective129" />
+  </defs>
+  <g
+     transform="translate(-31.428572,-40.933632)"
+     id="layer1">
+    <rect
+       width="100"
+       height="100"
+       x="31.428572"
+       y="40.933632"
+       id="rect12"
+       style="color:#000000;fill:#c8c365;fill-opacity:1;stroke:none;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+  </g>
+  <text
+     xml:space="preserve"
+     style="font-size:12px;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     x="85.658913"
+     y="93.023254"
+     id="text131"><tspan
+       sodipodi:role="line"
+       id="tspan133"
+       x="85.658913"
+       y="93.023254">D</tspan></text>
+</svg>
diff --git a/svg/LightSquare.svg b/svg/LightSquare.svg
new file mode 100644 (file)
index 0000000..b665d5e
--- /dev/null
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="100"
+   height="100"
+   id="svg2"
+   inkscape:version="0.46+devel r21645"
+   sodipodi:docname="LightSquare.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <metadata
+     id="metadata127">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1123"
+     inkscape:window-height="813"
+     id="namedview125"
+     showgrid="false"
+     inkscape:zoom="2.58"
+     inkscape:cx="-7.364341"
+     inkscape:cy="44.96124"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 50 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="100 : 50 : 1"
+       inkscape:persp3d-origin="50 : 33.333333 : 1"
+       id="perspective129" />
+  </defs>
+  <g
+     transform="translate(-31.428572,-40.933632)"
+     id="layer1"
+     style="stroke:#73d216;fill:#77a26d;fill-opacity:1">
+    <rect
+       width="100"
+       height="100"
+       x="31.428572"
+       y="40.933632"
+       id="rect12"
+       style="color:#000000;fill:#77a26d;fill-opacity:1;stroke:#73d216;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+  </g>
+  <text
+     xml:space="preserve"
+     style="font-size:12px;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     x="85.658913"
+     y="93.023254"
+     id="text131"><tspan
+       sodipodi:role="line"
+       id="tspan133"
+       x="85.658913"
+       y="93.023254">L</tspan></text>
+</svg>
diff --git a/svg/NeutralSquare.svg b/svg/NeutralSquare.svg
new file mode 100644 (file)
index 0000000..4b42698
--- /dev/null
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="100"
+   height="100"
+   id="svg2"
+   inkscape:version="0.46+devel r21645"
+   sodipodi:docname="NeutralSquare.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <metadata
+     id="metadata127">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="790"
+     inkscape:window-height="813"
+     id="namedview125"
+     showgrid="false"
+     inkscape:zoom="2.58"
+     inkscape:cx="62.015504"
+     inkscape:cy="44.96124"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 50 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="100 : 50 : 1"
+       inkscape:persp3d-origin="50 : 33.333333 : 1"
+       id="perspective129" />
+  </defs>
+  <g
+     transform="translate(-31.428572,-40.933632)"
+     id="layer1"
+     style="stroke:#d3d7cf;fill:#d3d7cf">
+    <rect
+       width="100"
+       height="100"
+       x="31.428572"
+       y="40.933632"
+       id="rect12"
+       style="color:#000000;fill:#d3d7cf;fill-opacity:1;stroke:#d3d7cf;stroke-width:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+  </g>
+  <text
+     xml:space="preserve"
+     style="font-size:12px;fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     x="85.658913"
+     y="93.023254"
+     id="text131"
+     inkscape:transform-center-x="-4.1767578"><tspan
+       sodipodi:role="line"
+       id="tspan133"
+       x="85.658913"
+       y="93.023254">N</tspan></text>
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="M 1.9379841,42.635659 32.558139,2.7131783"
+     id="path60" />
+  <path
+     id="path62"
+     d="M 9.3023252,53.875969 39.92248,13.953488"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="M 17.44186,62.403101 48.062015,22.48062"
+     id="path64" />
+  <path
+     id="path66"
+     d="M 31.395348,70.542636 62.015503,30.620155"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+  <path
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="M 31.395348,70.542636 62.015503,30.620155"
+     id="path68" />
+  <path
+     id="path70"
+     d="M 43.798449,83.720931 74.418604,43.79845"
+     style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+</svg>
diff --git a/svg/WhiteBishop.svg b/svg/WhiteBishop.svg
new file mode 100644 (file)
index 0000000..0ce3450
--- /dev/null
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="97.221024"
+   height="89.91935"
+   id="svg2833"
+   sodipodi:version="0.32"
+   inkscape:version="0.46+devel"
+   version="1.0"
+   sodipodi:docname="WhiteBishop.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2835">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2841" />
+    <inkscape:perspective
+       id="perspective2851"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2873"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2916"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2959"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3002"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3045"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3088"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3131"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3174"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3217"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.98994949"
+     inkscape:cx="8.7527877"
+     inkscape:cy="82.430952"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="658"
+     inkscape:window-height="834"
+     inkscape:window-x="564"
+     inkscape:window-y="56" />
+  <metadata
+     id="metadata2838">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-67.582896,-63.246303)">
+    <path
+       style="stroke-width:1px"
+       d="m 112.3227,76.671534 c -1.19098,-1.19098 -2.38196,-2.38197 -2.38196,-4.16844 -3.57296,-11.31436 16.07829,-11.31436 12.50533,0 0,1.78647 -1.19098,2.97746 -2.38197,4.16844 12.50534,4.76394 23.2242,16.673795 20.24674,30.370116 -1.19098,4.16845 -5.95492,8.33689 -6.55041,12.50534 -0.59549,3.57295 5.95492,10.71886 2.97746,13.69632 -2.97746,2.97746 -11.90985,2.38197 -15.4828,2.97746 l 0,0.5955 c 10.12337,4.76394 17.86477,1.78647 27.98814,2.97746 2.97746,0.59549 8.33689,1.78648 10.12337,4.16844 1.19098,2.97746 -2.97746,8.33689 -5.35943,8.33689 -2.97747,0.59549 -6.55042,-1.78648 -9.52788,-1.78648 -8.93239,-0.59549 -20.84223,2.97747 -27.98814,-4.16844 l -0.59549,0 c -7.14591,7.14591 -19.055757,3.57295 -27.988137,4.16844 -2.97746,0 -6.55042,2.38197 -9.52788,1.78648 -2.38197,0 -6.55041,-5.35943 -5.35943,-8.33689 1.78648,-2.38196 7.14591,-3.57295 10.12337,-4.16844 10.12337,-1.19099 17.864767,1.78648 27.988137,-2.97746 l 0,-0.5955 c -3.57295,-0.59549 -12.505337,0 -15.482797,-2.97746 -2.97746,-2.97746 3.57295,-10.12337 2.97746,-13.69632 -0.59549,-4.16845 -5.35943,-8.33689 -6.55041,-12.50534 -2.97747,-13.696321 7.7414,-25.606176 20.246727,-30.370116 z m 2.97747,-10.12337 c -4.76394,1.19099 -2.97747,8.3369 1.78647,7.7414 4.76394,-1.19098 2.97746,-8.33689 -1.78647,-7.7414 z m 1.19098,11.31436 c -2.97746,0 -5.95492,2.97746 -8.33689,4.16844 -7.7414,5.35944 -14.887307,11.314365 -13.696317,21.437736 0.59549,4.16844 2.97746,12.50534 8.336887,13.10083 6.55041,1.19098 13.69632,-1.19099 20.84223,-0.59549 2.97746,0.59549 6.55041,1.78647 8.93238,-0.5955 11.90985,-11.31435 2.97746,-25.606171 -7.7414,-32.752076 -2.38197,-1.78648 -5.35943,-4.16845 -8.33689,-4.76394 z m -1.78648,19.651245 c 0,-8.336895 2.97747,-8.336895 2.97747,0 8.33689,0 8.33689,2.977471 0,2.977471 0,8.33689 -2.97747,8.33689 -2.97747,0 -8.33689,0 -8.33689,-2.977471 0,-2.977471 z m 17.26928,28.583641 c 0,-1.78648 -0.59549,-4.76394 -2.38197,-5.95493 -1.78648,-0.59549 -4.16844,-0.59549 -5.95492,-1.19098 -5.35943,-0.59549 -16.07829,-1.78648 -20.84223,1.19098 -1.78648,1.19099 -2.38197,4.16845 -2.38197,5.95493 l 31.56109,0 z m 2.38197,5.35943 c -1.78648,-2.97747 -5.35943,-2.97747 -8.33689,-2.97747 -6.55042,-0.59549 -13.10083,-0.59549 -19.65125,0 -2.97746,0 -6.550407,0 -8.336887,2.97747 12.505337,1.78647 23.819687,1.78647 36.325027,0 z m 22.03322,13.69631 c -9.52788,-3.57294 -19.05576,0 -28.58364,-2.38196 -3.57295,-0.59549 -8.33689,-5.95492 -11.90984,-5.35943 -4.16845,0.59549 -7.7414,5.35943 -12.50534,5.95492 -9.527877,1.19098 -17.864767,-1.78647 -27.392647,1.78647 l 2.38197,4.76394 c 8.93239,-3.57295 17.26928,-0.59549 26.201657,-1.78648 3.57296,-0.59549 8.3369,-4.16844 11.90985,-4.16844 4.16845,0.59549 7.7414,3.57295 12.50534,4.16844 8.93238,0.5955 16.67378,-1.78647 25.01068,1.78648 z"
+       id="WhiteBishop" />
+  </g>
+</svg>
diff --git a/svg/WhiteKing.svg b/svg/WhiteKing.svg
new file mode 100644 (file)
index 0000000..00f969f
--- /dev/null
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="97.221024"
+   height="89.91935"
+   id="svg2833"
+   sodipodi:version="0.32"
+   inkscape:version="0.46+devel"
+   version="1.0"
+   sodipodi:docname="WhiteKing.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2835">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2841" />
+    <inkscape:perspective
+       id="perspective2851"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2873"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2916"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2959"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3002"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3045"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3088"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3131"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3174"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3217"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3260"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3303"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3346"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.98994949"
+     inkscape:cx="8.7527877"
+     inkscape:cy="82.430952"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="658"
+     inkscape:window-height="834"
+     inkscape:window-x="564"
+     inkscape:window-y="56" />
+  <metadata
+     id="metadata2838">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-67.582896,-63.246303)">
+    <path
+       style="stroke-width:1px"
+       d="m 107.00781,95.030706 c -4.16846,-2.38196 -8.336903,-4.76393 -13.100842,-5.35943 -10.71886,-1.19098 -23.2242,6.55042 -21.43773,19.055754 1.78648,8.93238 10.71887,11.31435 13.69633,18.46026 2.38197,4.76394 -1.19099,14.29181 2.38197,17.86477 2.38197,2.97746 8.336889,3.57295 11.909842,4.16844 10.71886,2.38197 22.62871,2.38197 33.34757,0 2.97746,-1.19098 8.33688,-1.78647 10.12337,-4.16844 4.16845,-3.57296 -0.5955,-13.69632 2.38196,-18.46026 4.16846,-6.55042 12.50535,-9.52788 13.69633,-18.46026 1.19099,-11.909844 -10.71886,-19.651244 -21.43773,-18.460264 -4.76393,0.595501 -8.93237,2.97747 -13.10083,5.35943 l -1.19098,-10.12336 -5.95492,-5.359429 -0.59549,-7.145911 c 5.35943,0 5.35943,-2.97746 0,-2.97746 0,-5.35943 -2.97746,-5.35943 -2.97746,0 -5.35942,0 -5.35942,2.97746 0,2.97746 l -0.59548,7.145911 -5.95493,5.359429 z m 32.15657,49.425864 c -13.69632,2.97746 -32.75206,7.7414 -45.852902,-0.5955 16.673792,-3.57295 29.179122,-3.57295 45.852902,0 v 0.5955 z M 90.929508,142.0746 c -2.38197,-5.95493 5.954919,-6.55042 10.123372,-7.7414 10.12337,-1.78648 20.84224,-1.78648 30.9656,0 5.35943,1.19098 10.12336,1.19098 10.12336,7.7414 -16.67378,-5.35943 -35.13403,-7.14591 -51.212332,0 z m 51.807832,-7.7414 c -10.12337,-2.97746 -21.43772,-5.35943 -32.15658,-4.16845 -7.14592,0.59549 -13.696333,2.97746 -20.842242,3.57295 0,-1.78647 -0.59549,-5.35943 0.59549,-6.55041 1.78648,-2.38197 7.145909,-2.97746 9.527879,-2.97746 10.123373,-2.38197 19.651263,-2.38197 29.774623,-0.59549 3.57294,0.59549 9.52787,0.59549 11.90984,2.97746 1.78647,1.78647 1.19099,5.35943 1.19099,7.7414 z m -27.98813,-14.88731 c -8.33689,0 -17.269293,4.16845 -25.606182,4.16845 -7.14591,-0.5955 -14.88731,-13.10084 -13.10083,-19.65125 2.38197,-12.505334 18.46026,-13.696314 27.392642,-7.741394 3.57297,2.38197 6.55042,5.954924 8.33691,9.527874 1.78647,4.16844 2.97746,8.93238 2.97746,13.69632 z m 2.97745,0 c 0,-4.76394 1.19099,-9.52788 2.97747,-13.69632 1.78647,-3.57295 4.76392,-7.145904 8.33688,-9.527874 8.93239,-5.95492 25.01068,-4.76394 27.39265,7.741394 1.78648,6.55041 -5.95492,19.05575 -13.10084,19.65125 -8.33688,0 -17.26927,-4.16845 -25.60616,-4.16845 z m -1.19097,-10.12337 c -3.57296,-5.95492 -10.12337,-17.864764 -4.76394,-24.415174 7.14589,-7.7414 11.31434,5.35943 10.12337,10.71886 -0.5955,4.763944 -4.16846,8.932374 -5.35943,13.696314 z"
+       id="WhiteKing" />
+  </g>
+</svg>
diff --git a/svg/WhiteKnight.svg b/svg/WhiteKnight.svg
new file mode 100644 (file)
index 0000000..d3f5995
--- /dev/null
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="97.221024"
+   height="89.91935"
+   id="svg2833"
+   sodipodi:version="0.32"
+   inkscape:version="0.46+devel"
+   version="1.0"
+   sodipodi:docname="WhiteKnight.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2835">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2841" />
+    <inkscape:perspective
+       id="perspective2851"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2873"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2916"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2959"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3002"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3045"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3088"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3131"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3174"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.98994949"
+     inkscape:cx="8.7527877"
+     inkscape:cy="82.430952"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="658"
+     inkscape:window-height="834"
+     inkscape:window-x="564"
+     inkscape:window-y="56" />
+  <metadata
+     id="metadata2838">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-67.582896,-63.246303)">
+    <path
+       style="stroke-width:1px"
+       d="m 147.48377,127.54791 c 5.95492,1.78648 11.90984,-2.38197 11.31435,-8.93238 -0.59549,-7.7414 -5.95492,-13.69633 -9.52788,-20.246743 -2.38197,-4.16845 -1.78647,-8.33689 -3.57295,-12.50534 -1.19099,-2.97746 -4.16845,-4.76394 -5.35943,-7.7414 -1.78648,-2.38197 2.38197,-9.52788 -0.59549,-11.90985 -2.97747,-2.38197 -10.12337,5.95493 -11.31436,8.3369 -4.76394,-3.57296 -7.14591,-14.29182 -11.90984,-4.16845 -0.5955,1.19098 -1.19099,2.38197 -1.19099,3.57295 -27.392626,2.38197 -38.111486,29.179133 -40.493456,53.594313 -0.5955,5.35943 -1.19099,10.71886 -1.19099,16.07829 0,1.78648 -0.59549,4.76394 1.19099,5.95493 2.38197,1.78647 9.52787,0.59549 12.50533,0.59549 l 34.538546,0 c 2.97746,0 12.50534,1.78648 13.69632,-1.78648 1.19098,-4.76394 -2.97746,-10.12337 -5.35943,-13.69632 -5.95492,-8.33689 -15.4828,-14.88731 -15.4828,-26.20166 4.76394,4.16844 11.31435,5.95492 16.67378,10.12337 3.57296,2.97746 6.55042,8.93238 10.12337,11.31435 2.38197,1.19099 4.76394,0 5.95493,-2.38197 z M 137.3604,70.380647 c 0,2.38197 -1.19099,5.95492 -0.5955,7.7414 0.5955,2.97746 4.16845,4.76394 5.35944,7.7414 1.78647,3.57295 1.78647,8.33689 3.57295,11.90985 2.38197,5.359433 6.55041,9.527873 8.93238,14.887303 1.19099,4.16845 2.38197,13.69633 -5.35943,12.50534 -2.97746,-1.19098 -4.16844,-4.16844 -6.55041,-5.95492 l 1.78647,8.33689 c -4.76393,-2.38197 -7.7414,-8.33689 -11.90984,-11.31435 -4.76394,-4.16845 -11.90985,-5.35943 -16.07829,-10.12337 -1.19099,-1.78648 -3.57296,-11.909853 -4.76394,-11.314363 -2.97746,0.5955 0.59549,10.123373 0.59549,11.909853 -1.19098,17.26928 16.67378,24.41519 20.24674,40.49348 l -52.998806,0 c 0,-26.79716 4.16845,-64.313173 35.134036,-70.268093 l 0.59549,3.57295 5.35943,-11.31435 c 1.19099,2.38196 2.97746,10.12336 5.95493,8.33689 l 7.1459,3.57295 -2.38197,-5.95492 z m 15.4828,48.234883 c 1.78647,-2.38197 -2.38197,-7.14591 -4.16845,-4.16845 -1.19098,2.38197 2.38197,6.55042 4.16845,4.16845 z M 139.74237,95.391327 c 1.19098,-4.76394 -4.16845,-11.90985 -8.93239,-8.3369 l 2.97746,0.5955 c -0.59549,3.57295 1.19099,5.35943 4.76394,4.76394 l 0.59549,2.97746 0.5955,0 z"
+       id="WhiteKnight" />
+  </g>
+</svg>
diff --git a/svg/WhitePawn.svg b/svg/WhitePawn.svg
new file mode 100644 (file)
index 0000000..37ff258
--- /dev/null
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="97.221024"
+   height="89.91935"
+   id="svg2833"
+   sodipodi:version="0.32"
+   inkscape:version="0.46+devel"
+   version="1.0"
+   sodipodi:docname="WhitePawn.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2835">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2841" />
+    <inkscape:perspective
+       id="perspective2851"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2873"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2916"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2959"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3002"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3045"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3088"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3131"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.98994949"
+     inkscape:cx="8.7527877"
+     inkscape:cy="82.430952"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="658"
+     inkscape:window-height="834"
+     inkscape:window-x="564"
+     inkscape:window-y="56" />
+  <metadata
+     id="metadata2838">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-67.582896,-63.246303)">
+    <path
+       style="stroke-width:1px"
+       d="m 103.45764,113.02448 c -10.123366,2.97746 -15.482796,14.29181 -17.269266,23.81969 0,2.38197 -2.38197,9.52788 1.19098,10.71886 4.16845,1.19099 9.52788,0 13.696316,0 h 30.37012 c 3.57295,0 11.90985,1.78648 14.29182,-0.59549 2.38197,-1.78648 0.59549,-7.7414 0.59549,-10.12337 -1.78648,-9.52788 -7.14591,-20.84223 -17.26928,-23.81969 5.35943,-7.7414 9.52788,-23.819692 -4.16844,-26.797152 1.19098,-2.97747 2.97746,-5.95493 2.38196,-9.52788 -1.19098,-8.93239 -14.29182,-11.31436 -19.65125,-4.76394 -4.16845,4.76394 -1.78648,9.52788 0,14.29182 -13.696316,2.97746 -9.527876,19.055752 -4.16845,26.797152 z m 40.49349,31.56109 H 88.570334 c 0,-8.93238 2.97747,-19.05575 9.52788,-25.01068 2.381966,-2.38196 8.932386,-3.57295 10.123366,-5.95492 1.19099,-1.78648 -1.78648,-2.97746 -2.97746,-4.16844 -2.97746,-1.78648 -4.16845,-5.35944 -4.16845,-8.93239 0,-4.16845 1.19099,-8.336892 4.76394,-10.718862 1.78648,-0.59549 4.76394,-1.19099 5.95492,-2.97746 1.19099,-1.19099 -2.97746,-4.76394 -3.57295,-6.55042 -1.19098,-7.7414 7.7414,-11.90984 13.69633,-7.14591 2.97747,1.78648 2.97747,6.55042 1.19099,9.52788 -0.59549,1.19099 -2.97746,2.38197 -2.38197,4.16845 0,1.78647 5.35943,2.38197 6.55041,3.57295 3.57296,2.38197 4.16845,6.550422 4.16845,10.718862 0,3.57296 -1.78648,6.55042 -4.16845,8.3369 -1.19098,1.19098 -4.16844,2.38196 -2.97746,4.16844 1.19099,2.38197 7.7414,3.57296 10.12337,5.95492 6.55042,5.95493 9.52788,16.0783 9.52788,25.01068 z"
+       id="WhitePawn" />
+  </g>
+</svg>
diff --git a/svg/WhiteQueen.svg b/svg/WhiteQueen.svg
new file mode 100644 (file)
index 0000000..4f34b87
--- /dev/null
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="97.221024"
+   height="89.91935"
+   id="svg2833"
+   sodipodi:version="0.32"
+   inkscape:version="0.46+devel"
+   version="1.0"
+   sodipodi:docname="WhiteQueen.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2835">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2841" />
+    <inkscape:perspective
+       id="perspective2851"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2873"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2916"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2959"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3002"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3045"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3088"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3131"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3174"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3217"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3260"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3303"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.98994949"
+     inkscape:cx="8.7527877"
+     inkscape:cy="82.430952"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="658"
+     inkscape:window-height="834"
+     inkscape:window-x="564"
+     inkscape:window-y="56" />
+  <metadata
+     id="metadata2838">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-67.582896,-63.246303)">
+    <path
+       style="stroke-width:1px"
+       d="m 157.58012,87.289307 c 7.14591,-0.59549 8.93239,-11.90984 0.5955,-12.50533 -2.97746,0 -5.35943,1.78647 -5.95494,4.76393 -0.59548,2.97747 1.78649,5.35944 1.19099,7.7414 -1.78647,7.7414 -8.33688,16.078303 -12.50533,22.628713 l -1.78648,-31.561093 c 6.55041,-1.19098 7.14591,-10.71886 0,-11.90985 -6.55041,-0.59549 -9.52787,8.3369 -3.57296,11.31436 l -10.12336,30.370113 -0.5955,0 c -1.19099,-7.14591 -2.97746,-13.696333 -4.16845,-20.842243 -0.59549,-2.97746 -2.38197,-7.1459 -1.78646,-10.12336 0,-2.97747 3.57294,-4.16845 3.57294,-7.14591 0,-3.57296 -2.38197,-6.55042 -5.95491,-6.55042 -3.57296,0 -6.55042,2.38197 -6.55042,5.95493 0,3.57295 3.57294,4.76393 3.57294,8.33689 0,9.52787 -4.16843,20.84223 -5.95491,30.370113 l -0.5955,0 -10.123364,-30.370113 c 5.954924,-2.97746 2.97746,-11.90985 -3.572951,-11.31436 -7.14591,1.19099 -6.55042,10.71887 0,11.90985 l -1.78648,31.561093 c -4.16845,-6.55041 -10.71886,-14.887313 -12.50534,-22.628713 -0.59549,-2.38196 1.78648,-4.76393 1.19099,-7.7414 -0.5955,-2.97746 -2.97747,-4.76393 -5.95493,-4.76393 -8.33689,0.59549 -6.55041,11.90984 0.5955,12.50533 0.59549,9.52788 1.78647,22.628713 5.35943,31.561103 2.38197,4.76394 6.55041,7.7414 7.7414,13.69632 1.19098,5.35943 -6.55042,11.31435 -2.97747,16.07829 2.38197,2.38197 8.3369,2.38197 11.909851,2.97746 11.909854,1.78648 24.415184,1.78648 36.920524,0 3.57296,-0.59549 11.31436,0 13.69633,-2.97746 3.57295,-4.76394 -4.16845,-10.71886 -2.97747,-16.07829 1.19099,-5.95492 5.95493,-8.93238 7.7414,-14.29182 2.97747,-8.93238 4.76394,-21.437723 5.35943,-30.965603 z m 2.97747,-5.95492 c 0,3.57296 -5.35943,2.97746 -5.35943,-0.59549 0.59549,-4.16845 5.95491,-2.97746 5.35943,0.59549 z m -7.14592,13.10083 -3.57295,21.437733 -7.7414,-1.19099 10.71887,-20.246743 0.59548,0 z m -5.35942,24.415193 -5.35944,6.55041 -11.90984,-1.78647 -20.24674,-0.5955 -20.842235,2.38197 -5.35943,-6.55041 c 5.95493,-3.57296 16.078295,-2.38197 22.628705,-2.38197 2.97747,0 5.95493,-1.78648 8.93239,-1.78648 2.97747,-0.59549 5.35943,1.78648 8.3369,1.78648 7.1459,0.59549 17.26927,-1.78648 23.81969,2.38197 z m -61.335715,27.98814 c 1.78648,-4.16845 8.33689,-3.57296 12.505341,-4.16845 11.909854,-1.78648 23.224194,-1.78648 35.134034,0 3.57296,0.59549 9.52789,0 11.31436,4.16845 -19.05575,4.76393 -39.89799,3.57295 -58.953735,0 z m 55.976285,-6.55042 -19.65125,-1.78648 -33.347575,2.38197 c 1.78648,-4.76394 7.145911,-4.16844 11.909855,-4.76394 10.12337,-0.59549 20.24674,-1.19098 30.37011,0 4.16844,0.5955 8.33689,0.5955 10.71886,4.16845 z m -0.5955,-11.90985 c 0,1.78648 0,5.35943 -2.38196,5.95493 -4.76395,1.19098 -11.90986,-1.78648 -16.67379,-1.78648 -7.14591,0 -13.69632,0 -20.84223,0.59549 -2.977464,0 -6.550415,1.78648 -9.527885,1.19099 -2.38196,-0.5955 -2.38196,-4.16845 -2.38196,-5.95493 16.078295,-3.57295 35.729535,-3.57295 51.807825,0 z m -1.19098,-54.785293 c -1.19098,3.57296 -6.55042,1.78648 -5.35943,-1.78648 1.19097,-3.57295 6.55041,-1.78647 5.35943,1.78648 z m -4.16845,11.31436 1.19099,29.179123 -11.31435,-0.59549 9.52787,-28.583633 0.59549,0 z m -20.24673,-2.97747 5.95492,30.965603 -5.95492,-1.78647 -6.55042,1.78647 5.95492,-30.965603 0.5955,0 z m 2.38197,-11.31435 c -1.19099,3.57295 -6.55042,1.78648 -5.35944,-1.78648 1.19099,-3.57295 6.55042,-1.78647 5.35944,1.78648 z m -13.10084,42.279953 -11.314355,1.19099 1.19099,-29.179123 0.595491,0 z M 96.839906,73.592987 c -1.190981,3.57296 -6.550411,1.78648 -5.359431,-1.78648 1.19098,-3.57295 6.550421,-1.78647 5.359431,1.78648 z m -17.269281,20.84223 10.71887,20.246743 -7.7414,1.19099 -3.57296,-21.437733 0.59549,0 z m -2.97746,-12.50534 c -1.19098,3.57296 -5.95492,1.78648 -4.76394,-1.78647 1.19099,-3.57296 5.95493,-1.78648 4.76394,1.78647 z"
+       id="WhiteQueen" />
+  </g>
+</svg>
diff --git a/svg/WhiteRook.svg b/svg/WhiteRook.svg
new file mode 100644 (file)
index 0000000..82b4fa1
--- /dev/null
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="97.221024"
+   height="89.91935"
+   id="svg2833"
+   sodipodi:version="0.32"
+   inkscape:version="0.46+devel"
+   version="1.0"
+   sodipodi:docname="WhiteRook.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs2835">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       id="perspective2841" />
+    <inkscape:perspective
+       id="perspective2851"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2873"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2916"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2959"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3002"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3045"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3088"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3131"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3174"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3217"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective3260"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.98994949"
+     inkscape:cx="8.7527877"
+     inkscape:cy="82.430952"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="658"
+     inkscape:window-height="834"
+     inkscape:window-x="564"
+     inkscape:window-y="56" />
+  <metadata
+     id="metadata2838">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-67.582896,-63.246303)">
+    <path
+       style="stroke-width:1px"
+       d="m 86.628286,138.26862 c -1.78648,0 -4.76394,-0.59549 -5.95493,0.59549 -1.78647,1.19099 -1.78647,7.7414 0,8.3369 4.16845,2.38196 13.100829,0.59549 17.86477,0.59549 h 35.729544 c 4.76394,0 11.90985,1.19098 16.67379,0 2.38197,-1.19099 2.97746,-7.14591 0.59549,-8.93239 -1.19099,-1.19098 -4.16845,-0.59549 -5.95492,-0.59549 0,-2.97746 0.59549,-6.55041 -0.5955,-8.93238 -1.19098,-2.97747 -4.76393,-4.16845 -5.95492,-7.7414 -1.78648,-7.7414 -0.59549,-20.24673 0,-27.988134 0.59549,-4.16845 5.35943,-5.95493 7.14591,-8.93239 2.38197,-2.97746 1.78648,-11.31435 1.19098,-14.29181 -1.19098,-2.97746 -11.90984,-2.97746 -13.69632,-1.19099 -1.78648,1.19099 -1.19098,4.16845 -1.19098,5.95493 h -8.93239 c 0,-1.78648 0.59549,-4.16845 -0.59549,-5.35943 -1.19099,-1.78648 -12.50535,-1.78648 -13.69634,0 -1.19098,1.19098 -0.59549,3.57295 -0.59549,5.35943 h -8.932375 c 0,-1.78648 0.595485,-4.76394 -1.19099,-5.95493 -1.78647,-1.78647 -12.50533,-1.78647 -13.69632,1.19099 -0.59549,2.97746 -1.19098,11.31435 1.19099,14.29181 1.78647,2.97746 6.55041,4.76394 7.1459,8.93239 0.59549,7.741404 1.78648,20.246734 0,27.988134 -1.19098,3.57295 -4.76394,4.76393 -5.95492,7.7414 -1.19098,2.38197 -0.59549,5.95492 -0.59549,8.93238 z m 63.122184,6.55042 H 82.459836 v -3.57296 h 67.290634 v 3.57296 z m -7.14591,-6.55042 H 89.605746 v -6.55041 h 52.998814 v 6.55041 z m -2.38196,-9.52788 H 91.987716 c 2.97746,-4.16844 5.95492,-3.57295 10.718864,-3.57295 h 25.60617 c 4.76394,0 8.93238,-0.59549 11.90985,3.57295 z m -4.16845,-6.55041 H 96.156156 V 91.820226 h 39.897994 v 30.370104 z m 5.35943,-37.516014 c -2.97746,4.16845 -6.55042,4.16845 -11.31435,4.16845 h -26.20167 c -5.359434,0 -9.527875,0.59549 -13.100834,-4.16845 h 50.616854 z m 2.97746,-2.97746 H 87.819265 v -10.12337 h 8.932391 c 0,1.78648 -0.5955,4.16845 1.19098,5.35943 1.78648,1.78648 10.718864,1.78648 12.505344,0 1.78648,-1.19098 1.19098,-3.57295 1.19098,-5.35943 h 8.93239 c 0,1.78648 -0.59549,4.16845 1.19098,5.35943 1.78648,1.78648 10.71887,1.78648 12.50534,0 1.78648,-1.19098 1.19099,-3.57295 1.19099,-5.35943 h 8.93238 v 10.12337 z"
+       id="WhiteRook" />
+  </g>
+</svg>
diff --git a/svg/icon_black.svg b/svg/icon_black.svg
new file mode 100644 (file)
index 0000000..24d5b7c
--- /dev/null
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.46+devel"
+   width="32"
+   height="32"
+   version="1.0"
+   sodipodi:docname="icon_black.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="640"
+     inkscape:window-height="734"
+     id="namedview4"
+     showgrid="false"
+     inkscape:zoom="7.375"
+     inkscape:cx="16"
+     inkscape:cy="16"
+     inkscape:window-x="634"
+     inkscape:window-y="0"
+     inkscape:current-layer="svg2" />
+  <path
+     style="fill:#000000"
+     d="m 0.27118704,16 0,-16.0000004020788 15.99999996,0 16,0 L 32.271187,16 l 0,16 -16,0 -15.99999996,0 0,-16 z M 28.919242,23.906869 C 28.053429,15.623218 25.152215,9.3861088 21.162363,7.2309164 19.399942,6.2789122 17.142774,4.7268367 16.146434,3.7818598 14.444939,2.1680791 14.277213,2.1668149 13.385036,3.7610462 12.501414,5.3399914 12.289955,5.3269596 10.353176,3.5741984 8.3053043,1.7209002 8.271187,1.7251938 8.271187,3.8362109 c 0,1.1804026 -1.4037353,5.2855788 -3.1194118,9.1226141 C 3.4360988,16.79586 2.2969756,20.624821 2.6203905,21.467626 3.5547678,23.902575 7.2162477,23.255422 10.923968,20 c 6.110849,-5.365397 7.267241,-3.487344 1.847219,3 -5.4858439,6.566128 -5.0741326,7 6.642456,7 L 29.5561,30 28.919242,23.906869 z M 26.814452,27.75 C 26.597771,27.0625 26.119035,24.260561 25.750593,21.52347 24.88161,15.067928 21.963564,9.4397249 18.515686,7.5690921 17.006211,6.7501326 16.273001,6.0620579 16.886328,6.0400372 18.91702,5.967128 23.297398,10.131053 25.281652,14.020514 27.222525,17.824939 29.159078,29 27.877484,29 27.509497,29 27.031133,28.4375 26.814452,27.75 z M 8.271187,11.098444 c 0,-1.038441 1.902213,-2.5417285 2.465672,-1.9485799 C 10.919794,9.3424386 10.439855,10.080242 9.6703278,10.789427 8.9008003,11.498611 8.271187,11.637669 8.271187,11.098444 z M 11.00452,6.8759119 c 0.678334,-0.6834184 1.485241,-0.9906713 1.793128,-0.6827842 0.307888,0.3078871 -0.247112,0.8670476 -1.233333,1.242579 -1.425198,0.5426846 -1.540062,0.427821 -0.559795,-0.5597948 z"
+     id="path2822" />
+</svg>
diff --git a/svg/icon_white.svg b/svg/icon_white.svg
new file mode 100644 (file)
index 0000000..2a8abe4
--- /dev/null
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   sodipodi:docname="icon_white.svg"
+   version="1.0"
+   height="32"
+   width="32"
+   inkscape:version="0.46+devel"
+   sodipodi:version="0.32"
+   id="svg2">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       id="perspective10" />
+  </defs>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1052"
+     inkscape:window-height="734"
+     id="namedview4"
+     showgrid="false"
+     inkscape:zoom="7.375"
+     inkscape:cx="-1.2881356"
+     inkscape:cy="15.542936"
+     inkscape:window-x="3"
+     inkscape:window-y="25"
+     inkscape:current-layer="svg2" />
+  <path
+     style="fill:#000000"
+     d="m 7.0614407,2.0815678 c -0.2645133,0.033288 -0.28125,0.569491 -0.28125,1.625 0,1.180403 -1.4093238,5.287965 -3.125,9.1250002 -1.715677,3.837035 -2.85466502,7.657195 -2.53125,8.5 0.934377,2.434949 4.6047795,1.786672 8.3125,-1.46875 6.1108493,-5.365397 7.2637723,-3.487344 1.8437503,3 -5.4858444,6.566128 -5.0603393,7 6.65625,7 l 10.125,0 -0.625,-6.09375 c -0.865813,-8.283651 -3.760148,-14.5323082 -7.75,-16.6875002 -1.762421,-0.952004 -4.03491,-2.492523 -5.03125,-3.4375 -1.701495,-1.613781 -1.857823,-1.625482 -2.75,-0.03125 -0.883622,1.578945 -1.094471,1.565261 -3.0312503,-0.1875 -1.023936,-0.926649 -1.5479867,-1.377038 -1.8125,-1.34375 z m 8.3437503,3.8125 c 2.030692,-0.07291 6.390746,4.1105392 8.375,8.0000002 1.940873,3.804425 3.875344,14.96875 2.59375,14.96875 -0.367987,0 -0.845819,-0.5625 -1.0625,-1.25 -0.216681,-0.6875 -0.694058,-3.481659 -1.0625,-6.21875 -0.868983,-6.455542 -3.770872,-12.0981172 -7.21875,-13.9687502 -1.509476,-0.818959 -2.238327,-1.50923 -1.625,-1.53125 z m -4.40625,0.03125 c 0.129543,0.00381 0.235528,0.048028 0.3125,0.125 0.307888,0.307887 -0.263779,0.874469 -1.25,1.25 -1.4251983,0.542685 -1.5427675,0.425116 -0.5625003,-0.5625 0.5087503,-0.512563 1.1113703,-0.82394 1.5000003,-0.8125 z m -2.0312503,2.96875 c 0.1059384,0.013632 0.2108176,0.050857 0.28125,0.125 0.182935,0.192575 -0.2929726,0.915815 -1.0625,1.6250002 -0.7695275,0.709184 -1.40625,0.851725 -1.40625,0.3125 0,-0.908636 1.445931,-2.1579272 2.1875,-2.0625002 z"
+     id="path2823" />
+</svg>
diff --git a/svg/pieces.svg b/svg/pieces.svg
new file mode 100644 (file)
index 0000000..d0501db
--- /dev/null
@@ -0,0 +1,121 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="svg2816"
+   sodipodi:version="0.32"
+   inkscape:version="0.46+devel"
+   width="100%"
+   height="100%"
+   sodipodi:docname="pieces.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"><defs
+   id="defs3144">
+  <inkscape:perspective
+     sodipodi:type="inkscape:persp3d"
+     inkscape:vp_x="0 : 0.5 : 1"
+     inkscape:vp_y="0 : 1000 : 0"
+     inkscape:vp_z="1 : 0.5 : 1"
+     inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+     id="perspective3146" />
+</defs>
+<sodipodi:namedview
+   pagecolor="#ffffff"
+   bordercolor="#666666"
+   borderopacity="1"
+   objecttolerance="10"
+   gridtolerance="10"
+   guidetolerance="10"
+   inkscape:pageopacity="0"
+   inkscape:pageshadow="2"
+   inkscape:window-width="970"
+   inkscape:window-height="808"
+   id="namedview3129"
+   showgrid="false"
+   inkscape:zoom="0.63429568"
+   inkscape:cx="396.46666"
+   inkscape:cy="670.65445"
+   inkscape:window-x="39"
+   inkscape:window-y="65"
+   inkscape:current-layer="svg2816" />
+<metadata
+   id="metadata2818">
+Created by FontForge 20080430 at Sun Apr  5 00:31:19 2009
+ By Arun Persaud
+Generated from MetaFont bitmap by mftrace 1.2.15, http://www.xs4all.nl/~hanwen/mftrace/ 
+<rdf:RDF>
+  <cc:Work
+     rdf:about="">
+    <dc:format>image/svg+xml</dc:format>
+    <dc:type
+       rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+    <dc:title />
+  </cc:Work>
+</rdf:RDF>
+</metadata>
+<path
+   style="stroke-width:1px"
+   d="m 59.335058,154.1479 c -4.16845,-2.38197 -8.33689,-4.76394 -13.10083,-5.35943 -10.71886,-1.19099 -23.2242,6.55041 -21.43773,19.05575 1.78648,8.93239 10.71887,11.31436 13.69633,18.46027 2.38197,4.76394 -1.19099,14.29182 2.38197,17.86477 1.78647,2.38197 7.1459,2.97746 10.12337,4.16845 10.71886,2.38197 22.6287,2.38197 33.34757,0 3.57295,-0.5955 9.52787,-1.19099 11.90984,-4.16845 4.168452,-3.57295 -0.59549,-13.69632 2.38197,-18.46026 4.168452,-6.55042 12.505342,-9.52789 13.696322,-18.46027 1.19099,-11.90985 -10.71886,-19.65125 -21.437722,-18.46026 -4.76394,0.59549 -8.93238,2.97746 -13.10083,5.35943 l -1.19098,-10.12337 -5.95493,-5.35943 -0.59549,-7.14591 c 5.35943,0 5.35943,-2.97746 0,-2.97746 0,-5.35943 -2.97746,-5.35943 -2.97746,0 -5.35943,0 -5.35943,2.97746 0,2.97746 l -0.59549,7.14591 -5.95493,5.35943 z m 10.71886,24.41518 c 0,-13.10083 8.93238,-26.20166 22.62871,-26.79715 11.909842,-0.59549 20.246742,10.12337 14.291812,20.84223 -2.38197,4.16845 -8.932382,11.31436 -13.696322,12.50535 -3.57295,0.59549 -7.7414,-1.78648 -11.31435,-1.78648 -6.55042,-1.19099 -13.10083,-1.78648 -19.65125,-1.19099 -5.35943,0.5955 -14.29182,4.16845 -19.05575,2.38197 -7.14591,-2.38197 -17.26928,-13.10083 -14.88731,-21.43773 2.38197,-11.31435 16.07829,-13.10083 25.01068,-8.93238 8.93238,4.76394 13.69632,14.29181 13.69632,24.41518 l 2.97746,0 z m -26.20166,3.57296 c 4.76394,-1.19098 9.52788,-2.38197 14.29181,-2.97746 1.78648,0 4.16845,0.59549 5.35943,-1.19099 1.78648,-1.78648 -0.59549,-7.7414 -1.78647,-10.12337 -3.57296,-7.7414 -10.71886,-13.10083 -19.65125,-12.50534 -8.33689,0.5955 -13.69632,8.93239 -8.33689,16.67379 2.38197,4.16844 7.14591,5.95492 10.12337,10.12337 z m 0.59549,11.31436 c 0.59549,-2.38197 7.14591,-2.97746 8.93239,-2.97746 9.52787,-1.78648 19.65124,-2.38197 29.17912,-0.5955 1.78648,0.5955 10.71886,1.19099 10.12337,4.16845 -0.59549,2.97746 -8.93239,-0.59549 -10.71886,-0.59549 -9.52788,-1.78648 -20.24674,-1.78648 -29.77462,0.59549 -1.19098,0 -8.33689,2.38197 -7.7414,-0.59549 z m 0,7.7414 c 0.59549,-2.38197 7.14591,-2.97746 8.93239,-3.57296 9.52787,-2.38197 19.65124,-2.38197 29.17912,-0.59549 1.78648,0.59549 10.71886,1.78648 10.12337,4.76394 -0.59549,2.97746 -8.93239,-0.59549 -10.71886,-1.19098 -9.52788,-1.78648 -20.24674,-1.78648 -29.77462,0.59549 -1.19098,0.59549 -8.33689,3.57295 -7.7414,0 z m 23.81969,-33.94307 c -1.78647,-2.97746 -2.97746,-5.95492 -4.76394,-8.93238 -1.78647,-4.76394 -1.78647,-20.24674 7.7414,-15.4828 8.3369,4.16844 1.78648,19.65124 -2.97746,24.41518 z m 0.5955,-5.95492 c 0.59549,-1.78648 1.78647,-4.16845 2.38196,-5.95493 0.5955,-2.38197 1.19099,-12.50533 -4.16844,-9.52787 -4.76394,2.97746 -0.59549,12.50534 1.78648,15.4828 z m 24.41518,20.84223 c 2.97746,-4.16845 7.741402,-5.95493 10.123372,-10.12337 5.35943,-7.7414 0,-16.07829 -8.336892,-16.67379 -8.93239,-0.59549 -16.0783,4.76394 -19.65125,12.50534 -1.19098,2.38197 -3.57295,8.33689 -1.78648,10.12337 1.19099,1.78648 3.57296,1.19099 5.35943,1.19099 4.76394,0.59549 9.52788,1.78648 14.29182,2.97746 z"
+   id="BlackKing" />
+<path
+   style="stroke-width:1px"
+   d="m 168.20357,168.21641 c -2.97746,-7.7414 -8.93239,-13.69632 -11.31436,-21.43772 -1.19098,-3.57296 1.78648,-6.55042 -0.59549,-10.12337 -1.78648,-2.97747 -6.55041,-4.16845 -9.52788,-1.19099 -5.95492,6.55042 3.57296,8.93239 4.76394,13.10083 3.57296,8.93239 2.38197,19.65125 5.95493,28.58364 1.19098,3.57294 4.16845,5.95491 5.95492,8.93237 1.78648,2.38197 2.97746,7.14591 1.19099,10.12337 -1.19099,2.97747 -5.35944,7.14591 -2.97746,10.71887 2.38196,3.57295 10.12336,2.97746 14.29181,3.57295 13.69632,1.78648 33.94306,3.57296 47.04389,-1.78648 7.14591,-2.97746 -1.78648,-12.50534 -0.59549,-18.46026 1.19098,-5.35943 5.95492,-8.33689 7.7414,-13.69632 2.38197,-8.93238 1.78648,-19.05575 5.35943,-27.98814 1.19098,-3.57295 5.95492,-3.57295 6.55042,-8.33689 0,-7.14591 -10.12337,-8.93238 -12.50534,-1.78648 -0.5955,2.97746 1.78647,5.35943 1.19098,7.7414 -1.78648,7.14591 -8.33689,16.0783 -12.50534,22.03322 l -1.78647,-30.37011 c 7.7414,-3.57295 5.35943,-15.4828 -2.97747,-11.90985 -2.38196,0.5955 -4.16844,3.57296 -4.16844,6.55042 0.59549,2.38197 2.97746,3.57295 2.97746,5.95492 -0.59549,9.52788 -8.33689,19.05576 -9.52788,28.58363 h -0.59549 c -1.19098,-10.12337 -5.95492,-20.24673 -5.95492,-30.3701 0,-2.97747 3.57295,-4.76394 3.57295,-8.3369 0,-2.97746 -2.97746,-5.95492 -5.95492,-5.95492 -3.57295,0 -6.55042,2.38197 -6.55042,5.95492 0,3.57296 3.57296,5.35943 3.57296,8.3369 0,10.12337 -4.76394,20.24673 -5.95492,30.3701 h -0.5955 c -1.19098,-9.52787 -8.93238,-19.05575 -9.52787,-28.58363 0,-2.38197 2.38197,-3.57295 2.97746,-5.95492 0,-2.97746 -1.19099,-5.95492 -4.16845,-6.55042 -8.33689,-3.57295 -10.71886,8.3369 -2.97746,11.90985 l -1.78648,30.37011 h -0.59549 z m 52.99881,32.15658 c 1.19099,0 1.19099,2.38197 0,2.38197 -1.19098,0 -1.19098,-2.38197 0,-2.38197 z m -51.21233,-4.76394 c -4.16845,-1.78648 5.95492,-3.57295 7.14591,-3.57295 10.12336,-1.19099 20.24673,-1.78648 30.3701,-0.59549 2.38197,0.59549 7.7414,0 9.52788,2.38196 2.97746,2.97747 -4.76394,1.78648 -5.95492,1.78648 -8.3369,-1.19098 -17.86477,-1.78648 -26.20166,-1.19098 -3.57296,0.59549 -11.31436,2.97746 -14.88731,1.19098 z m -1.19099,-8.93238 c -4.76394,-1.19099 5.35943,-4.16845 6.55042,-4.16845 11.31435,-1.19098 22.03321,-1.78648 33.34757,0 2.38197,0 8.33689,0 10.12337,2.38197 2.38196,2.97746 -7.14591,1.19098 -8.3369,1.19098 -8.33689,-1.19098 -17.26927,-1.78647 -25.60616,-1.19098 -4.16845,0.59549 -11.90985,2.97746 -16.0783,1.78648 z"
+   id="BlackQueen" />
+<path
+   style="stroke-width:1px"
+   d="m 288.78242,197.38582 c -1.78648,0 -4.76394,-0.5955 -5.95493,0.59549 -1.78647,1.19098 -1.78647,7.7414 0,8.33689 4.16845,2.38197 13.10083,0.59549 17.86477,0.59549 h 35.72954 c 4.76394,0 11.90985,1.19099 16.67379,0 2.38197,-1.19098 2.97746,-7.1459 0.59549,-8.93238 -1.19099,-1.19099 -4.16845,-0.59549 -5.95492,-0.59549 0,-2.97747 0.59549,-6.55042 -0.5955,-8.93239 -1.19098,-2.97746 -4.76393,-4.16844 -5.95492,-7.7414 -1.78648,-7.7414 -0.59549,-20.24674 0,-27.98814 0.59549,-4.16844 5.35943,-5.95492 7.14591,-8.93238 2.38197,-2.97746 1.78648,-11.31435 1.19098,-14.29182 -1.19098,-2.97746 -11.90984,-2.97746 -13.69632,-1.19098 -1.78648,1.19098 -1.19098,4.16845 -1.19098,5.95492 h -8.93239 c 0,-1.78647 0.59549,-4.16844 -0.59549,-5.35943 -1.19099,-1.78648 -12.50534,-1.78648 -13.69633,0 -1.19098,1.19099 -0.59549,3.57296 -0.59549,5.35943 h -8.93238 c 0,-1.78647 0.59549,-4.76394 -1.19099,-5.95492 -1.78647,-1.78648 -12.50533,-1.78648 -13.69632,1.19098 -0.59549,2.97747 -1.19098,11.31436 1.19099,14.29182 1.78647,2.97746 6.55041,4.76394 7.1459,8.93238 0.59549,7.7414 1.78648,20.24674 0,27.98814 -1.19098,3.57296 -4.76394,4.76394 -5.95492,7.7414 -1.19098,2.38197 -0.59549,5.95492 -0.59549,8.93239 z m 4.16844,2.97746 c -1.78647,-0.59549 -0.59549,-2.38197 1.19099,-2.97746 11.90984,-1.78648 25.01068,0 36.92052,0 2.97746,0 10.12337,-1.19099 12.50534,0.59549 4.16845,2.97746 -8.33689,2.97746 -9.52788,2.97746 h -29.17912 c -2.97746,0 -8.93239,1.19098 -11.90985,-0.59549 z m 1.78648,-10.12337 c -4.76394,-1.78648 5.35943,-2.97746 6.55042,-2.97746 h 29.77461 c 2.38197,0 9.52788,-1.19099 11.31436,1.19098 2.97746,2.97746 -8.93239,2.38197 -10.12337,2.38197 h -26.20167 c -2.97746,0 -8.33689,1.19099 -11.31435,-0.59549 z m 4.76394,-6.55042 c -1.78648,-0.59549 -1.19099,-2.38197 0.59549,-2.97746 8.33689,-2.38197 20.24674,0 28.58363,0 2.38197,0 7.7414,-1.19098 8.93239,1.19099 2.38197,2.97746 -6.55042,2.38197 -7.7414,2.38197 h -20.84223 c -2.97747,0 -7.14591,0.59549 -9.52788,-0.5955 z m 0,-32.75207 c -1.78648,-0.5955 -1.19099,-2.38197 0.59549,-2.97746 8.33689,-2.38197 20.24674,0 28.58363,0 2.38197,0 7.7414,-1.19099 8.93239,1.19098 2.38197,2.97746 -6.55042,2.38197 -7.7414,2.38197 h -20.84223 c -2.97747,0 -7.14591,0.59549 -9.52788,-0.59549 z m -7.14591,-7.7414 c -1.78648,-0.5955 -0.59549,-2.38197 1.19099,-2.97746 11.90984,-1.78648 26.20166,0 38.1115,0 2.97747,0 10.12337,-1.19099 12.50534,0.59549 4.16845,2.97746 -8.33689,2.97746 -9.52787,2.97746 h -29.77462 c -3.57295,0 -9.52788,1.19098 -12.50534,-0.59549 z"
+   id="BlackRook" />
+<path
+   style="stroke-width:1px"
+   d="m 438.81393,196.74872 c -7.7414,2.97746 -12.50534,2.97746 -20.84223,2.97746 -5.35943,0 -11.90985,-0.59549 -16.67379,2.97747 -2.38196,2.38196 1.78648,8.33689 4.16845,8.33689 2.97746,0.59549 5.95493,-1.78648 8.93239,-1.78648 6.55041,-0.59549 12.50534,1.78648 19.05575,0 2.97746,-0.59549 6.55042,-3.57295 9.52787,-3.57295 2.97746,0 7.14591,2.97746 10.12337,3.57295 4.76394,1.19099 9.52788,0 14.29182,0 4.16844,0 10.71886,2.97747 14.29181,1.78648 1.78648,-0.59549 4.76394,-4.76394 4.16845,-7.14591 -0.59549,-2.97746 -7.14591,-3.57295 -9.52788,-4.16845 -10.71886,-1.19098 -19.05575,2.97747 -28.58363,-3.57295 2.97746,0 16.67378,0 16.67378,-4.16846 0.5955,-4.16844 -4.16844,-8.33689 -2.97746,-13.10083 0.5955,-4.76394 4.76394,-8.33689 5.95493,-13.69632 2.97746,-13.69633 -8.3369,-23.8197 -19.65125,-29.17913 1.19098,-1.78647 2.38197,-4.16844 2.38197,-6.55041 -0.59549,-8.93239 -14.8873,-7.7414 -13.69632,1.19098 0.59549,1.78648 1.78648,3.57296 2.38197,5.35943 -11.31435,5.35943 -22.62871,15.4828 -19.65124,29.17913 1.19098,5.35943 5.35943,8.93238 5.95492,13.69632 1.19098,4.76394 -3.57296,8.93239 -2.97746,13.10083 0,4.16846 13.69632,4.16846 16.67378,4.16846 l 0,0.59549 z m 20.24673,-9.52789 c -0.59549,1.78648 -5.35943,0.5955 -6.55041,0.5955 -6.55042,-0.5955 -13.10083,-0.5955 -19.65124,0 -1.19099,0 -5.95492,1.19098 -5.35943,-1.19099 0.59549,-2.38197 4.16844,-2.38197 5.95492,-2.38197 6.55042,-0.59549 12.50533,-0.59549 19.05575,0 1.78648,0 7.14591,0 6.55041,2.97746 z m -2.97746,-10.12337 c 0,2.38197 -3.57295,1.78648 -4.76394,1.78648 -5.35943,-0.59549 -10.71885,-0.59549 -16.07828,0 -1.19099,0 -4.16845,0.59549 -4.76394,-1.19098 0,-2.38197 4.16845,-2.38197 5.35943,-2.38197 5.35943,-0.5955 9.52787,-0.5955 14.8873,0 1.19099,0 4.76394,0 5.35943,1.78647 z m -11.31435,-20.24674 c 8.33689,0 8.33689,3.57296 0,3.57296 0,8.33689 -3.57295,8.33689 -3.57295,0 -7.7414,0 -7.7414,-3.57296 0,-3.57296 0,-8.33689 3.57295,-8.33689 3.57295,0 z"
+   id="BlackBishop" />
+<path
+   style="stroke-width:1px"
+   d="m 579.84034,133.84303 c -2.38197,-1.78647 -4.76394,-8.33689 -7.7414,-8.93238 -3.57296,-0.59549 -4.76394,7.14591 -7.7414,8.33689 -4.76394,1.78648 -9.52788,1.78648 -14.29184,4.76394 -14.8873,9.52788 -19.65124,27.98814 -22.03321,44.06643 -1.19099,6.55042 -1.78648,13.10083 -1.78648,19.65125 0,1.78648 -0.59549,5.35943 0.59549,6.55041 1.78648,2.38198 10.71887,1.19099 13.69633,1.19099 h 35.72955 c 4.16845,0 11.31436,1.78648 10.71886,-4.76394 -2.97746,-14.88731 -20.24673,-21.43772 -20.84223,-36.92052 5.35943,4.16844 11.90985,5.95492 16.67379,10.12337 3.57295,2.97746 6.55041,8.93238 10.12337,11.31435 2.38197,1.19098 4.76394,0 5.95492,-2.38197 5.95492,1.78648 11.90985,-2.38197 11.31435,-8.93238 -0.59549,-7.74141 -5.95492,-13.69633 -9.52787,-20.24675 -2.38197,-4.16844 -1.78648,-8.33689 -3.57296,-12.50533 -1.19098,-2.97747 -4.16844,-4.76394 -5.35943,-7.7414 -1.78647,-2.38197 2.38197,-9.52788 -0.59549,-11.90985 -2.97746,-2.38197 -10.12337,5.95492 -11.31435,8.33689 z m -12.50534,2.97746 c -1.78648,3.57296 -5.35943,2.97747 -8.33689,4.76394 -4.16845,1.19099 -7.14593,4.76394 -10.12339,7.7414 -8.93239,11.31436 -13.10083,29.17913 -13.10083,43.47094 0,5.35943 1.19098,13.69633 -5.95492,13.69633 0,-19.65125 1.78647,-42.27996 14.8873,-58.35825 4.76394,-5.95493 14.29184,-13.10083 22.62873,-11.31436 z m 30.9656,47.63939 -1.78648,0.59549 -1.78648,-5.95492 h 0.5955 z m 4.16844,-5.95492 c -2.97746,-0.59549 -4.16844,-5.35943 -0.59549,-5.35943 2.97746,0 3.57296,5.95492 0.59549,5.35943 z m -36.32503,-13.10083 h -1.19098 l -1.78648,-6.55042 c 2.38197,1.19098 2.97746,4.16845 2.97746,6.55042 z m 25.01068,-10.71887 -1.19098,-2.97746 c -3.57296,0.59549 -5.35943,-1.19098 -4.76394,-4.76394 l -2.97746,-0.59549 v -0.59549 c 5.35943,-1.19099 10.12337,3.57295 8.93238,8.93238 z m -4.76394,-13.10083 c -1.19098,0 -2.97746,0 -4.16844,-0.59549 -11.31436,-3.57295 2.97746,-5.95492 4.16844,0.59549 z"
+   id="BlackKnight" />
+<path
+   style="stroke-width:1px"
+   d="m 684.52055,145.34451 c -1.78648,-4.76394 -4.16845,-9.52787 0,-14.29181 5.35943,-6.55042 18.46026,-4.16845 19.65124,4.76394 0.5955,3.57295 -1.19098,6.55041 -2.38196,9.52787 13.69632,2.97746 9.52787,19.05576 4.16844,26.79716 10.12337,2.97746 15.4828,14.29182 17.26928,23.81969 0,2.38197 1.78648,8.33689 -0.59549,10.12337 -2.38197,2.38197 -10.71887,0.59549 -14.29182,0.59549 l -30.37011,0 c -4.16844,0 -9.52787,1.19099 -13.69632,0 -3.57295,-1.19098 -1.19098,-8.33689 -1.19098,-10.71886 1.78647,-9.52787 7.1459,-20.84223 17.26927,-23.81969 -5.35943,-7.7414 -9.52787,-23.8197 4.16845,-26.79716 z"
+   id="BlackPawn" />
+<path
+   style="stroke-width:1px"
+   d="m 59.335058,282.61707 c -4.16845,-2.38196 -8.33689,-4.76393 -13.10083,-5.35943 -10.71886,-1.19098 -23.2242,6.55042 -21.43773,19.05576 1.78648,8.93238 10.71887,11.31435 13.69633,18.46026 2.38197,4.76394 -1.19099,14.29181 2.38197,17.86477 2.38197,2.97746 8.33689,3.57295 11.90984,4.16844 10.71886,2.38197 22.62871,2.38197 33.34757,0 2.97746,-1.19098 8.33689,-1.78647 10.12337,-4.16844 4.168452,-3.57296 -0.59549,-13.69632 2.38197,-18.46026 4.168452,-6.55042 12.505342,-9.52788 13.696322,-18.46026 1.19099,-11.90985 -10.71886,-19.65125 -21.437722,-18.46027 -4.76394,0.5955 -8.93238,2.97747 -13.10083,5.35943 l -1.19098,-10.12336 -5.95493,-5.35943 -0.59549,-7.14591 c 5.35943,0 5.35943,-2.97746 0,-2.97746 0,-5.35943 -2.97746,-5.35943 -2.97746,0 -5.35943,0 -5.35943,2.97746 0,2.97746 l -0.59549,7.14591 -5.95493,5.35943 z m 32.15658,49.42587 c -13.69632,2.97746 -32.75207,7.7414 -45.8529,-0.5955 16.67378,-3.57295 29.17912,-3.57295 45.8529,0 v 0.5955 z m -48.23487,-2.38197 c -2.38197,-5.95493 5.95492,-6.55042 10.12337,-7.7414 10.12336,-1.78648 20.84223,-1.78648 30.9656,0 5.35943,1.19098 10.12336,1.19098 10.12336,7.7414 -16.67378,-5.35943 -35.13404,-7.14591 -51.21233,0 z m 51.80783,-7.7414 c -10.12337,-2.97746 -21.43773,-5.35943 -32.15659,-4.16845 -7.14591,0.59549 -13.69632,2.97746 -20.84223,3.57295 0,-1.78647 -0.59549,-5.35943 0.59549,-6.55041 1.78648,-2.38197 7.14591,-2.97746 9.52788,-2.97746 10.12337,-2.38197 19.65125,-2.38197 29.77462,-0.59549 3.57295,0.59549 9.52787,0.59549 11.90984,2.97746 1.78648,1.78647 1.19099,5.35943 1.19099,7.7414 z m -27.98814,-14.88731 c -8.33689,0 -17.26928,4.16845 -25.60617,4.16845 -7.14591,-0.5955 -14.88731,-13.10084 -13.10083,-19.65125 2.38197,-12.50534 18.46026,-13.69632 27.39264,-7.7414 3.57296,2.38197 6.55042,5.95492 8.3369,9.52788 1.78647,4.16844 2.97746,8.93238 2.97746,13.69632 z m 2.97746,0 c 0,-4.76394 1.19098,-9.52788 2.97746,-13.69632 1.78648,-3.57296 4.76394,-7.14591 8.33689,-9.52788 8.93239,-5.95492 25.010682,-4.76394 27.392652,7.7414 1.78648,6.55041 -5.95492,19.05575 -13.100832,19.65125 -8.33689,0 -17.26928,-4.16845 -25.60617,-4.16845 z m -1.19098,-10.12337 c -3.57296,-5.95492 -10.12337,-17.86477 -4.76394,-24.41518 7.1459,-7.7414 11.31435,5.35943 10.12337,10.71886 -0.5955,4.76394 -4.16845,8.93238 -5.35943,13.69632 z"
+   id="WhiteKing" />
+<path
+   style="stroke-width:1px"
+   d="m 234.82082,274.87567 c 7.14591,-0.59549 8.93239,-11.90984 0.5955,-12.50533 -2.97746,0 -5.35943,1.78647 -5.95493,4.76393 -0.59549,2.97747 1.78648,5.35944 1.19099,7.7414 -1.78648,7.7414 -8.33689,16.0783 -12.50534,22.62871 l -1.78648,-31.56109 c 6.55042,-1.19098 7.14591,-10.71886 0,-11.90985 -6.55041,-0.59549 -9.52787,8.3369 -3.57295,11.31436 l -10.12337,30.37011 -0.59549,0 c -1.19099,-7.14591 -2.97746,-13.69633 -4.16845,-20.84224 -0.59549,-2.97746 -2.38197,-7.1459 -1.78647,-10.12336 0,-2.97747 3.57295,-4.16845 3.57295,-7.14591 0,-3.57296 -2.38197,-6.55042 -5.95492,-6.55042 -3.57296,0 -6.55042,2.38197 -6.55042,5.95493 0,3.57295 3.57295,4.76393 3.57295,8.33689 0,9.52787 -4.16844,20.84223 -5.95492,30.37011 l -0.59549,0 -10.12337,-30.37011 c 5.95492,-2.97746 2.97746,-11.90985 -3.57295,-11.31436 -7.14591,1.19099 -6.55042,10.71887 0,11.90985 l -1.78648,31.56109 c -4.16845,-6.55041 -10.71886,-14.88731 -12.50534,-22.62871 -0.59549,-2.38196 1.78648,-4.76393 1.19099,-7.7414 -0.5955,-2.97746 -2.97747,-4.76393 -5.95493,-4.76393 -8.33689,0.59549 -6.55041,11.90984 0.5955,12.50533 0.59549,9.52788 1.78647,22.62871 5.35943,31.5611 2.38197,4.76394 6.55041,7.7414 7.7414,13.69632 1.19098,5.35943 -6.55042,11.31435 -2.97747,16.07829 2.38197,2.38197 8.3369,2.38197 11.90985,2.97746 11.90985,1.78648 24.41519,1.78648 36.92052,0 3.57296,-0.59549 11.31436,0 13.69633,-2.97746 3.57295,-4.76394 -4.16845,-10.71886 -2.97747,-16.07829 1.19099,-5.95492 5.95493,-8.93238 7.7414,-14.29182 2.97747,-8.93238 4.76394,-21.43772 5.35943,-30.9656 z m 2.97747,-5.95492 c 0,3.57296 -5.35943,2.97746 -5.35943,-0.59549 0.59549,-4.16845 5.95492,-2.97746 5.35943,0.59549 z m -7.14591,13.10083 -3.57296,21.43773 -7.7414,-1.19099 10.71887,-20.24674 0.59549,0 z m -5.35943,24.41519 -5.35943,6.55041 -11.90985,-1.78647 -20.24674,-0.5955 -20.84223,2.38197 -5.35943,-6.55041 c 5.95493,-3.57296 16.07829,-2.38197 22.62871,-2.38197 2.97746,0 5.95492,-1.78648 8.93238,-1.78648 2.97747,-0.59549 5.35944,1.78648 8.3369,1.78648 7.1459,0.59549 17.26927,-1.78648 23.81969,2.38197 z m -61.33571,27.98814 c 1.78648,-4.16845 8.33689,-3.57296 12.50534,-4.16845 11.90985,-1.78648 23.2242,-1.78648 35.13404,0 3.57296,0.59549 9.52788,0 11.31436,4.16845 -19.05575,4.76393 -39.89799,3.57295 -58.95374,0 z m 55.97628,-6.55042 -19.65125,-1.78648 -33.34757,2.38197 c 1.78648,-4.76394 7.14591,-4.16844 11.90985,-4.76394 10.12337,-0.59549 20.24674,-1.19098 30.37011,0 4.16844,0.5955 8.33689,0.5955 10.71886,4.16845 z m -0.5955,-11.90985 c 0,1.78648 0,5.35943 -2.38196,5.95493 -4.76394,1.19098 -11.90985,-1.78648 -16.67379,-1.78648 -7.14591,0 -13.69632,0 -20.84223,0.59549 -2.97746,0 -6.55041,1.78648 -9.52788,1.19099 -2.38196,-0.5955 -2.38196,-4.16845 -2.38196,-5.95493 16.07829,-3.57295 35.72953,-3.57295 51.80782,0 z m -1.19098,-54.78529 c -1.19098,3.57296 -6.55042,1.78648 -5.35943,-1.78648 1.19098,-3.57295 6.55041,-1.78647 5.35943,1.78648 z m -4.16845,11.31436 1.19099,29.17912 -11.31435,-0.59549 9.52787,-28.58363 0.59549,0 z m -20.24673,-2.97747 5.95492,30.9656 -5.95492,-1.78647 -6.55042,1.78647 5.95492,-30.9656 0.5955,0 z m 2.38197,-11.31435 c -1.19099,3.57295 -6.55042,1.78648 -5.35944,-1.78648 1.19099,-3.57295 6.55042,-1.78647 5.35944,1.78648 z m -13.10084,42.27995 -11.31435,1.19099 1.19099,-29.17912 0.59549,0 z m -8.93238,-39.30249 c -1.19098,3.57296 -6.55041,1.78648 -5.35943,-1.78648 1.19098,-3.57295 6.55042,-1.78647 5.35943,1.78648 z m -17.26928,20.84223 10.71887,20.24674 -7.7414,1.19099 -3.57296,-21.43773 0.59549,0 z m -2.97746,-12.50534 c -1.19098,3.57296 -5.95492,1.78648 -4.76394,-1.78647 1.19099,-3.57296 5.95493,-1.78648 4.76394,1.78647 z"
+   id="WhiteQueen" />
+<path
+   style="stroke-width:1px"
+   d="m 288.78242,325.85499 c -1.78648,0 -4.76394,-0.59549 -5.95493,0.59549 -1.78647,1.19099 -1.78647,7.7414 0,8.3369 4.16845,2.38196 13.10083,0.59549 17.86477,0.59549 h 35.72954 c 4.76394,0 11.90985,1.19098 16.67379,0 2.38197,-1.19099 2.97746,-7.14591 0.59549,-8.93239 -1.19099,-1.19098 -4.16845,-0.59549 -5.95492,-0.59549 0,-2.97746 0.59549,-6.55041 -0.5955,-8.93238 -1.19098,-2.97747 -4.76393,-4.16845 -5.95492,-7.7414 -1.78648,-7.7414 -0.59549,-20.24674 0,-27.98814 0.59549,-4.16845 5.35943,-5.95493 7.14591,-8.93239 2.38197,-2.97746 1.78648,-11.31435 1.19098,-14.29181 -1.19098,-2.97746 -11.90984,-2.97746 -13.69632,-1.19099 -1.78648,1.19099 -1.19098,4.16845 -1.19098,5.95493 h -8.93239 c 0,-1.78648 0.59549,-4.16845 -0.59549,-5.35943 -1.19099,-1.78648 -12.50534,-1.78648 -13.69633,0 -1.19098,1.19098 -0.59549,3.57295 -0.59549,5.35943 h -8.93238 c 0,-1.78648 0.59549,-4.76394 -1.19099,-5.95493 -1.78647,-1.78647 -12.50533,-1.78647 -13.69632,1.19099 -0.59549,2.97746 -1.19098,11.31435 1.19099,14.29181 1.78647,2.97746 6.55041,4.76394 7.1459,8.93239 0.59549,7.7414 1.78648,20.24674 0,27.98814 -1.19098,3.57295 -4.76394,4.76393 -5.95492,7.7414 -1.19098,2.38197 -0.59549,5.95492 -0.59549,8.93238 z m 63.12218,6.55042 h -67.29063 v -3.57296 h 67.29063 v 3.57296 z m -7.14591,-6.55042 h -52.99881 v -6.55041 h 52.99881 v 6.55041 z m -2.38196,-9.52788 h -48.23488 c 2.97746,-4.16844 5.95492,-3.57295 10.71886,-3.57295 h 25.60617 c 4.76394,0 8.93238,-0.59549 11.90985,3.57295 z m -4.16845,-6.55041 h -39.89799 v -30.37011 h 39.89799 v 30.37011 z m 5.35943,-37.51602 c -2.97746,4.16845 -6.55042,4.16845 -11.31435,4.16845 h -26.20167 c -5.35943,0 -9.52787,0.59549 -13.10083,-4.16845 h 50.61685 z m 2.97746,-2.97746 H 289.9734 v -10.12337 h 8.93239 c 0,1.78648 -0.5955,4.16845 1.19098,5.35943 1.78648,1.78648 10.71886,1.78648 12.50534,0 1.78648,-1.19098 1.19098,-3.57295 1.19098,-5.35943 h 8.93239 c 0,1.78648 -0.59549,4.16845 1.19098,5.35943 1.78648,1.78648 10.71887,1.78648 12.50534,0 1.78648,-1.19098 1.19099,-3.57295 1.19099,-5.35943 h 8.93238 v 10.12337 z"
+   id="WhiteRook" />
+<path
+   style="stroke-width:1px"
+   d="m 439.39028,264.2579 c -1.19098,-1.19098 -2.38196,-2.38197 -2.38196,-4.16844 -3.57296,-11.31436 16.07829,-11.31436 12.50533,0 0,1.78647 -1.19098,2.97746 -2.38197,4.16844 12.50534,4.76394 23.2242,16.67379 20.24674,30.37011 -1.19098,4.16845 -5.95492,8.33689 -6.55041,12.50534 -0.59549,3.57295 5.95492,10.71886 2.97746,13.69632 -2.97746,2.97746 -11.90985,2.38197 -15.4828,2.97746 l 0,0.5955 c 10.12337,4.76394 17.86477,1.78647 27.98814,2.97746 2.97746,0.59549 8.33689,1.78648 10.12337,4.16844 1.19098,2.97746 -2.97746,8.33689 -5.35943,8.33689 -2.97747,0.59549 -6.55042,-1.78648 -9.52788,-1.78648 -8.93239,-0.59549 -20.84223,2.97747 -27.98814,-4.16844 l -0.59549,0 c -7.14591,7.14591 -19.05576,3.57295 -27.98814,4.16844 -2.97746,0 -6.55042,2.38197 -9.52788,1.78648 -2.38197,0 -6.55041,-5.35943 -5.35943,-8.33689 1.78648,-2.38196 7.14591,-3.57295 10.12337,-4.16844 10.12337,-1.19099 17.86477,1.78648 27.98814,-2.97746 l 0,-0.5955 c -3.57295,-0.59549 -12.50534,0 -15.4828,-2.97746 -2.97746,-2.97746 3.57295,-10.12337 2.97746,-13.69632 -0.59549,-4.16845 -5.35943,-8.33689 -6.55041,-12.50534 -2.97747,-13.69632 7.7414,-25.60617 20.24673,-30.37011 z m 2.97747,-10.12337 c -4.76394,1.19099 -2.97747,8.3369 1.78647,7.7414 4.76394,-1.19098 2.97746,-8.33689 -1.78647,-7.7414 z m 1.19098,11.31436 c -2.97746,0 -5.95492,2.97746 -8.33689,4.16844 -7.7414,5.35944 -14.88731,11.31436 -13.69632,21.43773 0.59549,4.16844 2.97746,12.50534 8.33689,13.10083 6.55041,1.19098 13.69632,-1.19099 20.84223,-0.59549 2.97746,0.59549 6.55041,1.78647 8.93238,-0.5955 11.90985,-11.31435 2.97746,-25.60617 -7.7414,-32.75207 -2.38197,-1.78648 -5.35943,-4.16845 -8.33689,-4.76394 z m -1.78648,19.65124 c 0,-8.33689 2.97747,-8.33689 2.97747,0 8.33689,0 8.33689,2.97747 0,2.97747 0,8.33689 -2.97747,8.33689 -2.97747,0 -8.33689,0 -8.33689,-2.97747 0,-2.97747 z m 17.26928,28.58364 c 0,-1.78648 -0.59549,-4.76394 -2.38197,-5.95493 -1.78648,-0.59549 -4.16844,-0.59549 -5.95492,-1.19098 -5.35943,-0.59549 -16.07829,-1.78648 -20.84223,1.19098 -1.78648,1.19099 -2.38197,4.16845 -2.38197,5.95493 l 31.56109,0 z m 2.38197,5.35943 c -1.78648,-2.97747 -5.35943,-2.97747 -8.33689,-2.97747 -6.55042,-0.59549 -13.10083,-0.59549 -19.65125,0 -2.97746,0 -6.55041,0 -8.33689,2.97747 12.50534,1.78647 23.81969,1.78647 36.32503,0 z m 22.03322,13.69631 c -9.52788,-3.57294 -19.05576,0 -28.58364,-2.38196 -3.57295,-0.59549 -8.33689,-5.95492 -11.90984,-5.35943 -4.16845,0.59549 -7.7414,5.35943 -12.50534,5.95492 -9.52788,1.19098 -17.86477,-1.78647 -27.39265,1.78647 l 2.38197,4.76394 c 8.93239,-3.57295 17.26928,-0.59549 26.20166,-1.78648 3.57296,-0.59549 8.3369,-4.16844 11.90985,-4.16844 4.16845,0.59549 7.7414,3.57295 12.50534,4.16844 8.93238,0.5955 16.67378,-1.78647 25.01068,1.78648 z"
+   id="WhiteBishop" />
+<path
+   style="stroke-width:1px"
+   d="m 599.46479,315.13427 c 5.95492,1.78648 11.90984,-2.38197 11.31435,-8.93238 -0.59549,-7.7414 -5.95492,-13.69633 -9.52788,-20.24674 -2.38197,-4.16845 -1.78647,-8.33689 -3.57295,-12.50534 -1.19099,-2.97746 -4.16845,-4.76394 -5.35943,-7.7414 -1.78648,-2.38197 2.38197,-9.52788 -0.59549,-11.90985 -2.97747,-2.38197 -10.12337,5.95493 -11.31436,8.3369 -4.76394,-3.57296 -7.14591,-14.29182 -11.90984,-4.16845 -0.5955,1.19098 -1.19099,2.38197 -1.19099,3.57295 -27.39263,2.38197 -38.11149,29.17913 -40.49346,53.59431 -0.5955,5.35943 -1.19099,10.71886 -1.19099,16.07829 0,1.78648 -0.59549,4.76394 1.19099,5.95493 2.38197,1.78647 9.52787,0.59549 12.50533,0.59549 l 34.53855,0 c 2.97746,0 12.50534,1.78648 13.69632,-1.78648 1.19098,-4.76394 -2.97746,-10.12337 -5.35943,-13.69632 -5.95492,-8.33689 -15.4828,-14.88731 -15.4828,-26.20166 4.76394,4.16844 11.31435,5.95492 16.67378,10.12337 3.57296,2.97746 6.55042,8.93238 10.12337,11.31435 2.38197,1.19099 4.76394,0 5.95493,-2.38197 z m -10.12337,-57.16726 c 0,2.38197 -1.19099,5.95492 -0.5955,7.7414 0.5955,2.97746 4.16845,4.76394 5.35944,7.7414 1.78647,3.57295 1.78647,8.33689 3.57295,11.90985 2.38197,5.35943 6.55041,9.52787 8.93238,14.8873 1.19099,4.16845 2.38197,13.69633 -5.35943,12.50534 -2.97746,-1.19098 -4.16844,-4.16844 -6.55041,-5.95492 l 1.78647,8.33689 c -4.76393,-2.38197 -7.7414,-8.33689 -11.90984,-11.31435 -4.76394,-4.16845 -11.90985,-5.35943 -16.07829,-10.12337 -1.19099,-1.78648 -3.57296,-11.90985 -4.76394,-11.31436 -2.97746,0.5955 0.59549,10.12337 0.59549,11.90985 -1.19098,17.26928 16.67378,24.41519 20.24674,40.49348 l -52.99881,0 c 0,-26.79716 4.16845,-64.31317 35.13404,-70.26809 l 0.59549,3.57295 5.35943,-11.31435 c 1.19099,2.38196 2.97746,10.12336 5.95493,8.33689 l 7.1459,3.57295 -2.38197,-5.95492 z m 15.4828,48.23488 c 1.78647,-2.38197 -2.38197,-7.14591 -4.16845,-4.16845 -1.19098,2.38197 2.38197,6.55042 4.16845,4.16845 z m -13.10083,-23.2242 c 1.19098,-4.76394 -4.16845,-11.90985 -8.93239,-8.3369 l 2.97746,0.5955 c -0.59549,3.57295 1.19099,5.35943 4.76394,4.76394 l 0.59549,2.97746 0.5955,0 z"
+   id="WhiteKnight" />
+<path
+   style="stroke-width:1px"
+   d="m 680.3521,300.61084 c -10.12337,2.97746 -15.4828,14.29181 -17.26927,23.81969 0,2.38197 -2.38197,9.52788 1.19098,10.71886 4.16845,1.19099 9.52788,0 13.69632,0 h 30.37011 c 3.57295,0 11.90985,1.78648 14.29182,-0.59549 2.38197,-1.78648 0.59549,-7.7414 0.59549,-10.12337 -1.78648,-9.52788 -7.14591,-20.84223 -17.26928,-23.81969 5.35943,-7.7414 9.52788,-23.81969 -4.16844,-26.79715 1.19098,-2.97747 2.97746,-5.95493 2.38196,-9.52788 -1.19098,-8.93239 -14.29181,-11.31436 -19.65124,-4.76394 -4.16845,4.76394 -1.78648,9.52788 0,14.29182 -13.69632,2.97746 -9.52788,19.05575 -4.16845,26.79715 z m 40.49348,31.56109 h -55.38079 c 0,-8.93238 2.97747,-19.05575 9.52788,-25.01068 2.38197,-2.38196 8.93239,-3.57295 10.12337,-5.95492 1.19099,-1.78648 -1.78648,-2.97746 -2.97746,-4.16844 -2.97746,-1.78648 -4.16845,-5.35944 -4.16845,-8.93239 0,-4.16845 1.19099,-8.33689 4.76394,-10.71886 1.78648,-0.59549 4.76394,-1.19099 5.95492,-2.97746 1.19099,-1.19099 -2.97746,-4.76394 -3.57295,-6.55042 -1.19098,-7.7414 7.7414,-11.90984 13.69632,-7.14591 2.97747,1.78648 2.97747,6.55042 1.19099,9.52788 -0.59549,1.19099 -2.97746,2.38197 -2.38197,4.16845 0,1.78647 5.35943,2.38197 6.55041,3.57295 3.57296,2.38197 4.16845,6.55042 4.16845,10.71886 0,3.57296 -1.78648,6.55042 -4.16845,8.3369 -1.19098,1.19098 -4.16844,2.38196 -2.97746,4.16844 1.19099,2.38197 7.7414,3.57296 10.12337,5.95492 6.55042,5.95493 9.52788,16.0783 9.52788,25.01068 z"
+   id="WhitePawn" />
+
+
+      style=&quot;stroke-width:1px&quot;
+         d=&quot;M0 161c2 5 6 9 12 11c-1 -6 -6 -12 -12 -11zM26 168l6 4c-1 -4 -2 -5 -6 -4zM42 164l10 8c-1 -6 -4 -8 -10 -8zM63 165l9 7c-1 -5 -4 -7 -9 -7zM80 161c2 5 6 9 12 11c-1 -6 -6 -11 -12 -11zM102 164l10 8c-1 -6 -5 -7 -10 -8zM123 164l9 8c-1 -5 -4 -8 -9 -8zM145 167 l7 5v-4zM162 159c-2 6 4 11 10 13c-1 -6 -5 -10 -10 -13zM78 133c-17 8 -30 3 -48 6c-4 0 -15 2 -16 7c-1 4 5 13 9 13c5 1 10 -3 15 -3c13 -1 40 7 48 -8c16 10 30 6 48 7c5 0 10 3 15 3c4 1 11 -8 9 -12c-3 -5 -12 -6 -17 -7c-11 -1 -21 2 -32 1c-5 -1 -10 -4 -15 -6v-1 c5 0 28 0 28 -7c1 -7 -7 -14 -5 -22c1 -8 8 -14 10 -23c5 -23 -14 -40 -33 -49c1 -3 3 -6 4 -9c2 -18 -28 -15 -22 2c0 3 2 5 4 7c-21 8 -39 28 -34 51c2 7 10 14 11 21c1 6 -10 18 -5 23s20 4 26 5v1zM24 155l-5 -8l47 -3l20 -11c0 31 -44 12 -62 22zM172 152l-4 -7 c0 4 0 6 4 7zM4 147c2 -4 0 -7 -4 -6zM0 121c3 6 10 15 17 13c-4 -5 -10 -14 -17 -13zM157 135l-8 -10l-24 -22c-1 5 3 8 7 12c8 8 15 15 25 20zM133 90c-2 6 3 9 7 13c9 9 20 26 32 29c-1 -6 -7 -11 -11 -15c-9 -9 -18 -20 -28 -27zM0 101c4 9 23 30 33 29 c-6 -9 -15 -16 -22 -23c-3 -3 -6 -7 -11 -6zM133 130l-3 -2zM86 127l-30 -3c5 -8 22 -6 30 -6v-5l-26 2c2 -14 15 -12 26 -12v-5c-7 0 -19 4 -25 0c-4 -2 -7 -8 -9 -13c-8 -24 13 -43 34 -51l3 33c14 0 14 6 0 6l-3 24c3 0 25 0 22 5c-3 4 -18 1 -22 1v9c7 0 15 0 22 2 c2 0 7 2 5 4c-1 3 -5 2 -7 1c-7 -1 -13 -1 -20 -1v9zM41 124c4 -5 -2 -9 -6 -13l-23 -23c-4 -4 -7 -8 -12 -7c7 16 29 31 41 43zM136 73c0 12 16 22 24 30c4 4 7 8 12 9l-10 -14zM47 110c3 -6 -3 -10 -7 -14l-27 -27c-4 -4 -7 -9 -13 -8l16 18zM106 23c-1 9 9 14 15 19 c12 11 22 24 34 36c5 5 10 12 17 14c-1 -9 -11 -15 -17 -21c-16 -16 -31 -35 -49 -48zM85 85l1 -30h-2v12c-14 0 -14 5 0 5zM36 79c2 -5 -1 -8 -4 -11c-7 -7 -22 -28 -32 -27c7 14 25 27 36 38zM100 1c3 7 11 13 17 19l35 35c6 6 12 15 20 17c-1 -8 -10 -14 -15 -19l-38 -38 c-5 -5 -12 -15 -19 -14zM38 61c3 -5 -2 -9 -5 -12l-21 -21c-4 -4 -7 -8 -12 -7c7 15 26 28 38 40zM120 1c7 14 25 27 36 38c5 5 9 11 16 13c-1 -6 -7 -11 -11 -15l-26 -26c-4 -4 -9 -11 -15 -10zM0 1c3 6 9 11 14 16c10 10 21 25 33 31c0 -6 -4 -9 -8 -13l-26 -26 c-4 -4 -7 -9 -13 -8zM20 1c5 11 18 20 27 29c3 3 7 9 12 5l-26 -26c-4 -4 -7 -9 -13 -8zM140 1c4 9 22 28 32 31c-1 -10 -14 -18 -21 -25c-3 -3 -6 -7 -11 -6zM67 30c3 -9 -19 -30 -27 -29c5 11 18 20 27 29zM86 28c-7 -3 -7 -10 0 -13v13zM69 12c5 -5 -3 -12 -9 -11zM160 1 c2 5 6 9 12 11c-1 -6 -6 -12 -12 -11zM85 1l-5 2z&quot;
+         id=&quot;path3095&quot; /&gt;
+      
+      style=&quot;stroke-width:1px&quot;
+         d=&quot;M0 161c2 5 6 9 12 11c-1 -6 -6 -12 -12 -11zM0 141c4 9 22 28 32 31c-1 -10 -14 -18 -21 -25c-3 -3 -6 -7 -11 -6zM43 165l9 7c-1 -5 -4 -6 -9 -7zM72 172c-1 -3 -3 -4 -6 -4zM92 172c-1 -3 -2 -3 -5 -3zM112 168h-6l6 4v-4zM124 166l8 6c-1 -5 -3 -7 -8 -6zM140 162 l12 10c-1 -6 -5 -11 -12 -10zM148 145c3 10 14 24 24 27c-2 -10 -16 -22 -24 -27zM17 51c1 16 3 38 9 53c4 8 11 13 13 23c2 9 -11 19 -5 27c4 4 14 4 20 5c21 3 42 3 63 0c6 -1 19 0 23 -6s-3 -13 -5 -18c-2 -4 -1 -7 0 -11c2 -9 10 -14 13 -22c4 -15 2 -34 9 -48 c2 -5 8 -5 10 -10c3 -8 -6 -17 -14 -13c-10 5 -2 13 -5 21c-3 12 -13 25 -20 36l-3 -51c13 -6 9 -26 -5 -20c-4 1 -7 6 -7 11c1 4 5 6 5 10c-1 16 -14 32 -16 48h-1c-2 -17 -10 -34 -10 -51c0 -6 7 -9 6 -16c-2 -7 -10 -10 -16 -6c-12 7 1 14 1 22c0 16 -7 35 -10 51h-1 l-17 -51c10 -5 5 -20 -6 -19c-12 2 -11 18 0 20l-3 53c-7 -11 -18 -25 -21 -38c-1 -4 3 -8 2 -13s-5 -8 -10 -8c-14 1 -11 20 1 21zM86 156l-49 -5c2 -6 8 -5 13 -6c12 -2 24 -3 36 -3v14zM144 121c-2 9 20 29 28 31c-2 -11 -19 -25 -28 -31zM133 142c2 0 2 4 0 4 s-2 -4 0 -4zM0 121c4 9 16 21 25 25c1 -8 -17 -26 -25 -25zM86 137l-44 4c5 -11 33 -9 44 -9v-5l-29 2h-11l-3 -9l43 -4v-5l-31 2l-14 1l-8 -10l14 -2l13 -4l26 -2v14c11 0 23 1 34 3c2 0 11 1 10 5c-2 3 -9 1 -11 0c-11 -1 -22 -2 -33 -2v10c11 0 21 1 32 2c2 1 11 1 9 5 c-2 3 -8 1 -10 1c-10 -1 -21 -2 -31 -2v5zM0 101c5 10 22 27 32 32c-2 -10 -13 -18 -20 -25c-4 -4 -7 -8 -12 -7zM150 113c6 6 13 17 22 19c-1 -7 -14 -23 -22 -20v1zM157 94c-2 8 8 16 15 18c-1 -7 -9 -14 -15 -18zM16 99c3 -7 -9 -19 -16 -18zM43 97l-13 2l-6 -36h1z M69 95l-19 1l2 -49h1zM86 47c0 13 7 45 -10 47l9 -47h1zM160 77c-2 7 6 13 12 15c-1 -7 -7 -11 -12 -15zM12 75c2 -7 -5 -15 -12 -14zM163 60c-1 6 3 10 9 12c-1 -6 -5 -9 -9 -12zM38 61c2 -5 -2 -9 -6 -12zM135 58h2l-3 -7zM70 53c3 -5 -2 -9 -6 -12zM172 51l-1 1zM99 36 c1 6 3 10 8 12c0 -6 -4 -9 -8 -12zM15 45c-5 -1 -4 -10 2 -10c6 1 4 11 -2 10zM139 38l-1 3zM73 36l-4 -10h-1zM50 31c-7 1 -7 -9 -1 -10c6 0 8 10 1 10zM30 30c1 -4 -2 -6 -5 -9c-6 -6 -16 -21 -25 -20zM171 30c0 -4 -3 -6 -6 -9c-6 -6 -16 -21 -25 -20zM105 26l-1 1z M144 27l4 -2l-9 -9zM0 21c2 3 3 4 7 4c-2 -3 -3 -5 -7 -4zM86 26c-6 -2 -5 -7 0 -10v10zM33 16c5 -6 -7 -16 -13 -15zM110 13l4 -2c-3 -5 -8 -11 -14 -10zM60 1l11 11c1 -6 -5 -12 -11 -11zM160 1c2 5 6 9 12 11c-1 -6 -6 -12 -12 -11zM133 11c-1 -5 -8 -11 -13 -10 c3 6 8 7 13 10zM40 1c2 5 6 7 11 7c-3 -4 -6 -8 -11 -7zM81 4l5 -1l-6 -2z&quot;
+         id=&quot;path3099&quot; /&gt;
+      style=&quot;stroke-width:1px&quot;
+         unicode=&quot;Ľ&quot;
+         d=&quot;M0 161c2 5 6 9 12 11c-1 -6 -6 -12 -12 -11zM0 141c4 9 22 28 32 31c-1 -10 -14 -18 -21 -25c-3 -3 -6 -7 -11 -6zM0 121c7 14 25 27 36 38c5 5 9 11 16 13c-1 -9 -11 -15 -18 -21c-6 -6 -12 -13 -19 -20c-4 -4 -9 -11 -15 -10zM58 160c4 5 8 10 14 12 c-1 -8 -7 -11 -14 -12zM81 163l11 9c-1 -6 -5 -9 -11 -9zM100 162l12 10c-1 -7 -6 -10 -12 -10zM117 159c4 5 9 11 15 13c-1 -7 -8 -13 -15 -13zM133 154c3 7 12 16 19 18c-1 -8 -11 -18 -19 -18zM143 140c0 10 19 29 29 32c-2 -11 -20 -26 -29 -32zM71 61 c-7 -4 -14 -8 -22 -9c-18 -2 -39 11 -36 32c3 15 18 19 23 31c4 8 -2 24 4 30c4 5 14 6 20 7c18 4 38 4 56 0c5 -2 14 -3 17 -7c7 -6 -1 -23 4 -31c7 -11 21 -16 23 -31c2 -20 -18 -33 -36 -31c-8 1 -15 5 -22 9l-2 -17l-10 -9l-1 -12c9 0 9 -5 0 -5c0 -9 -5 -9 -5 0 c-9 0 -9 5 0 5l-1 12l-10 9zM144 121c0 10 18 28 28 31c-2 -11 -19 -25 -28 -31zM86 150c-12 0 -28 -1 -38 -7l38 -6v-5c-15 0 -29 3 -43 8c0 -16 31 -15 43 -15v-5l-44 6l1 -11l11 -4l32 -4v-5h3c0 -9 2 -16 6 -24c3 -6 8 -12 14 -15c5 -3 10 -5 16 -6c14 -1 31 8 30 24 c-1 10 -8 18 -16 24c-4 3 -7 7 -12 8c-13 1 -28 -5 -41 -5v11c11 0 22 1 32 4c2 0 11 2 9 5s-8 1 -10 1c-10 -3 -20 -4 -31 -4v6c11 0 22 1 32 4c2 1 12 4 8 7c-2 2 -8 -1 -11 -1c-10 -3 -19 -4 -29 -4v13zM29 132c3 -9 -21 -32 -29 -31c5 12 20 22 29 31zM150 113 c6 6 13 17 22 19c-1 -7 -14 -23 -22 -20v1zM161 99c-1 6 5 11 11 13c-1 -6 -6 -10 -11 -13zM84 102c-14 0 -29 7 -43 7c-12 -1 -25 -22 -22 -33c4 -21 31 -23 46 -13c6 4 11 10 14 16c3 7 5 15 5 23zM128 108c5 -7 13 -10 17 -17c9 -13 0 -27 -14 -28c-15 -1 -27 8 -33 21 c-2 4 -6 14 -3 17c2 3 6 2 9 2c8 1 16 3 24 5zM168 85c-1 4 0 6 4 7zM5 88c1 -4 0 -8 -5 -7zM87 83c-8 -8 -19 -34 -5 -41c16 -8 16 18 13 26c-3 5 -5 10 -8 15zM86 73c5 -6 11 -24 0 -27v27zM100 1l16 18l39 34l17 19c-1 -8 -10 -14 -15 -19l-38 -38c-5 -5 -12 -15 -19 -14 zM6 69c3 -5 -1 -9 -6 -8zM0 41c2 5 11 17 17 12c-5 -5 -10 -13 -17 -12zM120 1c7 14 25 27 36 38c5 5 9 11 16 13c-1 -6 -7 -11 -11 -15l-26 -26c-4 -4 -9 -11 -15 -10zM0 21c4 8 20 27 30 26c-5 -7 -21 -27 -30 -26zM108 45l1 3zM20 1c6 12 21 23 30 32c5 5 9 10 15 13 c0 -6 -4 -9 -8 -13l-24 -24c-4 -4 -7 -9 -13 -8zM0 1c6 13 22 24 32 34c5 5 8 9 15 9c-9 -13 -22 -23 -33 -34c-4 -4 -8 -10 -14 -9zM106 23c-3 9 13 21 21 21zM71 34l4 -3c-9 -6 -16 -16 -23 -23c-4 -4 -7 -8 -12 -7c6 12 21 23 31 33zM140 1c4 9 22 28 32 31 c-1 -10 -14 -18 -21 -25c-3 -3 -6 -7 -11 -6zM60 1c3 6 7 11 14 10c-3 -5 -8 -11 -14 -10zM160 1c2 5 6 9 12 11c-1 -6 -6 -12 -12 -11zM84 0l-4 3l4 -2v-1z&quot;
+         id=&quot;glyph3101&quot; /&gt;
+      </svg>
index 7ce417c..d479ba3 100644 (file)
--- a/xboard.c
+++ b/xboard.c
@@ -2,7 +2,7 @@
  * xboard.c -- X front end for XBoard
  *
  * Copyright 1991 by Digital Equipment Corporation, Maynard,
- * Massachusetts. 
+ * Massachusetts.
  *
  * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,
  * 2007, 2008, 2009 Free Software Foundation, Inc.
@@ -182,6 +182,10 @@ extern char *getenv();
 #include "bitmaps/bitmaps.h"
 #endif
 
+#include <gtk/gtk.h>
+#include <gdk/gdk.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
 #include "bitmaps/icon_white.bm"
 #include "bitmaps/icon_black.bm"
 #include "bitmaps/checkmark.bm"
@@ -195,6 +199,8 @@ extern char *getenv();
 #include "xhistory.h"
 #include "xedittags.h"
 #include "gettext.h"
+#include "callback.h"
+#include "interface.h"
 
 // must be moved to xengineoutput.h
 
@@ -229,6 +235,13 @@ typedef struct {
     MenuItem *mi;
 } Menu;
 
+typedef struct {
+    char *name;
+    gboolean value;
+} Enables;
+
+
+
 int main P((int argc, char **argv));
 RETSIGTYPE CmailSigHandler P((int sig));
 RETSIGTYPE IntSigHandler P((int sig));
@@ -239,43 +252,23 @@ void CreateXPMPieces P((void));
 void CreatePieces P((void));
 void CreatePieceMenus P((void));
 Widget CreateMenuBar P((Menu *mb));
-Widget CreateButtonBar P ((MenuItem *mi));
 char *FindFont P((char *pattern, int targetPxlSize));
 void PieceMenuPopup P((Widget w, XEvent *event,
                       String *params, Cardinal *num_params));
 static void PieceMenuSelect P((Widget w, ChessSquare piece, caddr_t junk));
 static void DropMenuSelect P((Widget w, ChessSquare piece, caddr_t junk));
-void ReadBitmap P((Pixmap *pm, String name, unsigned char bits[],
-                  u_int wreq, u_int hreq));
-void CreateGrid P((void));
 int EventToSquare P((int x, int limit));
 void DrawSquare P((int row, int column, ChessSquare piece, int do_flash));
-void EventProc P((Widget widget, caddr_t unused, XEvent *event));
 void HandleUserMove P((Widget w, XEvent *event,
                     String *prms, Cardinal *nprms));
 void AnimateUserMove P((Widget w, XEvent * event,
                     String * params, Cardinal * nParams));
-void WhiteClock P((Widget w, XEvent *event,
-                  String *prms, Cardinal *nprms));
-void BlackClock P((Widget w, XEvent *event,
-                  String *prms, Cardinal *nprms));
-void DrawPositionProc P((Widget w, XEvent *event,
-                    String *prms, Cardinal *nprms));
-void XDrawPosition P((Widget w, /*Boolean*/int repaint,
-                    Board board));
 void CommentPopUp P((char *title, char *label));
 void CommentPopDown P((void));
 void CommentCallback P((Widget w, XtPointer client_data,
                        XtPointer call_data));
 void ICSInputBoxPopUp P((void));
 void ICSInputBoxPopDown P((void));
-void FileNamePopUp P((char *label, char *def,
-                     FileProc proc, char *openMode));
-void FileNamePopDown P((void));
-void FileNameCallback P((Widget w, XtPointer client_data,
-                        XtPointer call_data));
-void FileNameAction P((Widget w, XEvent *event,
-                      String *prms, Cardinal *nprms));
 void AskQuestionReplyAction P((Widget w, XEvent *event,
                          String *prms, Cardinal *nprms));
 void AskQuestionProc P((Widget w, XEvent *event,
@@ -288,48 +281,17 @@ void EditCommentPopDown P((void));
 void EditCommentCallback P((Widget w, XtPointer client_data,
                            XtPointer call_data));
 void SelectCommand P((Widget w, XtPointer client_data, XtPointer call_data));
-void ResetProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void LoadGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void LoadNextGameProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void LoadPrevGameProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void ReloadGameProc P((Widget w, XEvent *event, String *prms,
-                      Cardinal *nprms));
-void LoadPositionProc P((Widget w, XEvent *event,
-                        String *prms, Cardinal *nprms));
-void LoadNextPositionProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void LoadPrevPositionProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void ReloadPositionProc P((Widget w, XEvent *event, String *prms,
-                      Cardinal *nprms));
 void CopyPositionProc P((Widget w, XEvent *event, String *prms,
                         Cardinal *nprms));
 void PastePositionProc P((Widget w, XEvent *event, String *prms,
                          Cardinal *nprms));
 void CopyGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void PasteGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void SaveGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void SavePositionProc P((Widget w, XEvent *event,
-                        String *prms, Cardinal *nprms));
 void MailMoveProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void ReloadCmailMsgProc P((Widget w, XEvent *event, String *prms,
                            Cardinal *nprms));
-void QuitProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void PauseProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void MachineBlackProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void MachineWhiteProc P((Widget w, XEvent *event,
-                        String *prms, Cardinal *nprms));
 void AnalyzeModeProc P((Widget w, XEvent *event,
                         String *prms, Cardinal *nprms));
-void AnalyzeFileProc P((Widget w, XEvent *event,
-                        String *prms, Cardinal *nprms));
-void TwoMachinesProc P((Widget w, XEvent *event, String *prms,
-                       Cardinal *nprms));
-void IcsClientProc P((Widget w, XEvent *event, String *prms,
-                     Cardinal *nprms));
 void EditGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void EditPositionProc P((Widget w, XEvent *event,
                         String *prms, Cardinal *nprms));
@@ -338,62 +300,7 @@ void EditCommentProc P((Widget w, XEvent *event,
                        String *prms, Cardinal *nprms));
 void IcsInputBoxProc P((Widget w, XEvent *event,
                        String *prms, Cardinal *nprms));
-void AcceptProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void DeclineProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void RematchProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void CallFlagProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void DrawProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AbortProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AdjournProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void ResignProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AdjuWhiteProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AdjuBlackProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AdjuDrawProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void EnterKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void StopObservingProc P((Widget w, XEvent *event, String *prms,
-                         Cardinal *nprms));
-void StopExaminingProc P((Widget w, XEvent *event, String *prms,
-                         Cardinal *nprms));
-void BackwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void ForwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void ToStartProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void ToEndProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void RevertProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void TruncateGameProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void RetractMoveProc P((Widget w, XEvent *event, String *prms,
-                       Cardinal *nprms));
-void MoveNowProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AlwaysQueenProc P((Widget w, XEvent *event, String *prms,
-                       Cardinal *nprms));
-void AnimateDraggingProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void AnimateMovingProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void AutocommProc P((Widget w, XEvent *event, String *prms,
-                    Cardinal *nprms));
-void AutoflagProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AutoflipProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AutobsProc P((Widget w, XEvent *event, String *prms,
-                       Cardinal *nprms));
-void AutoraiseProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AutosaveProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void BlindfoldProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void FlashMovesProc P((Widget w, XEvent *event, String *prms,
-                      Cardinal *nprms));
-void FlipViewProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void GetMoveListProc P((Widget w, XEvent *event, String *prms,
-                       Cardinal *nprms));
-void HighlightDraggingProc P((Widget w, XEvent *event, String *prms,
-                             Cardinal *nprms));
-void HighlightLastMoveProc P((Widget w, XEvent *event, String *prms,
-                             Cardinal *nprms));
-void MoveSoundProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void IcsAlarmProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void OldSaveStyleProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void PeriodicUpdatesProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
 void PonderNextMoveProc P((Widget w, XEvent *event, String *prms,
                           Cardinal *nprms));
 void PopupMoveErrorsProc P((Widget w, XEvent *event, String *prms,
@@ -402,20 +309,7 @@ void PopupExitMessageProc P((Widget w, XEvent *event, String *prms,
                             Cardinal *nprms));
 void PremoveProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void QuietPlayProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void ShowCoordsProc P((Widget w, XEvent *event, String *prms,
-                      Cardinal *nprms));
-void ShowThinkingProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void HideThinkingProc P((Widget w, XEvent *event, String *prms,
-                        Cardinal *nprms));
-void TestLegalityProc P((Widget w, XEvent *event, String *prms,
-                         Cardinal *nprms));
-void InfoProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void ManProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void HintProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void BookProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void AboutGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void AboutProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void DebugProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void NothingProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void Iconify P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
@@ -444,6 +338,7 @@ void UciPopDown P(());
 void TimeControlPopDown P(());
 void NewVariantPopDown P(());
 void SettingsPopDown P(());
+void SetMenuEnables P((Enables *enab));
 void update_ics_width P(());
 int get_term_width P(());
 /*
@@ -457,17 +352,21 @@ Window xBoardWindow;
 Pixel lightSquareColor, darkSquareColor, whitePieceColor, blackPieceColor,
   jailSquareColor, highlightSquareColor, premoveHighlightColor;
 Pixel lowTimeWarningColor;
-GC lightSquareGC, darkSquareGC, jailSquareGC, lineGC, wdPieceGC, wlPieceGC,
-  bdPieceGC, blPieceGC, wbPieceGC, bwPieceGC, coordGC, highlineGC,
-  wjPieceGC, bjPieceGC, prelineGC, countGC;
+
+#define LINE_TYPE_NORMAL 0
+#define LINE_TYPE_HIGHLIGHT 1
+#define LINE_TYPE_PRE 2
+
+
+GC lightSquareGC, darkSquareGC, jailSquareGC,  wdPieceGC, wlPieceGC,
+  bdPieceGC, blPieceGC, wbPieceGC, bwPieceGC, coordGC,
+  wjPieceGC, bjPieceGC;
 Pixmap iconPixmap, wIconPixmap, bIconPixmap, xMarkPixmap;
 Widget shellWidget, layoutWidget, formWidget, boardWidget, messageWidget,
   whiteTimerWidget, blackTimerWidget, titleWidget, widgetList[16],
   commentShell, promotionShell, whitePieceMenu, blackPieceMenu, dropMenu,
-  menuBarWidget, buttonBarWidget, editShell, errorShell, analysisShell,
+  menuBarWidget,  editShell, errorShell, analysisShell,
   ICSInputShell, fileNameShell, askQuestionShell;
-XSegment gridSegments[(BOARD_SIZE + 1) * 2];
-XSegment jailGridSegments[(BOARD_SIZE + 3) * 2];
 Font clockFontID, coordFontID, countFontID;
 XFontStruct *clockFontStruct, *coordFontStruct, *countFontStruct;
 XtAppContext appContext;
@@ -499,7 +398,7 @@ Pixmap pieceBitmap2[2][(int)BlackPawn+4];       /* [HGM] pieces */
 Pixmap xpmPieceBitmap[4][(int)BlackPawn];      /* LL, LD, DL, DD actually used*/
 Pixmap xpmPieceBitmap2[4][(int)BlackPawn+4];   /* LL, LD, DL, DD set to select from */
 Pixmap xpmLightSquare, xpmDarkSquare, xpmJailSquare;
-int useImages, useImageSqs;
+int useImages=0, useImageSqs;
 XImage *ximPieceBitmap[4][(int)BlackPawn+4];   /* LL, LD, DL, DD */
 Pixmap ximMaskPm[(int)BlackPawn];               /* clipmasks, used for XIM pieces */
 Pixmap ximMaskPm2[(int)BlackPawn+4];            /* clipmasks, used for XIM pieces */
@@ -542,43 +441,188 @@ static Pixmap xpmMask[BlackKing + 1];
 
 SizeDefaults sizeDefaults[] = SIZE_DEFAULTS;
 
+Enables icsEnables[] = {
+    { "menuFile.Mail Move", False },
+    { "menuFile.Reload CMail Message", False },
+    { "menuMode.Machine Black", False },
+    { "menuMode.Machine White", False },
+    { "menuMode.Analysis Mode", False },
+    { "menuMode.Analyze File", False },
+    { "menuMode.Two Machines", False },
+#ifndef ZIPPY
+    { "menuHelp.Hint", False },
+    { "menuHelp.Book", False },
+    { "menuStep.Move Now", False },
+    { "menuOptions.Periodic Updates", False },
+    { "menuOptions.Hide Thinking", False },
+    { "menuOptions.Ponder Next Move", False },
+#endif
+    { NULL, False }
+};
+
+Enables ncpEnables[] = {
+    { "menuFile.Mail Move", False },
+    { "menuFile.Reload CMail Message", False },
+    { "menuMode.Machine White", False },
+    { "menuMode.Machine Black", False },
+    { "menuMode.Analysis Mode", False },
+    { "menuMode.Analyze File", False },
+    { "menuMode.Two Machines", False },
+    { "menuMode.ICS Client", False },
+    { "menuMode.ICS Input Box", False },
+    { "Action", False },
+    { "menuStep.Revert", False },
+    { "menuStep.Move Now", False },
+    { "menuStep.Retract Move", False },
+    { "menuOptions.Auto Comment", False },
+    { "menuOptions.Auto Flag", False },
+    { "menuOptions.Auto Flip View", False },
+    { "menuOptions.Auto Observe", False },
+    { "menuOptions.Auto Raise Board", False },
+    { "menuOptions.Get Move List", False },
+    { "menuOptions.ICS Alarm", False },
+    { "menuOptions.Move Sound", False },
+    { "menuOptions.Quiet Play", False },
+    { "menuOptions.Hide Thinking", False },
+    { "menuOptions.Periodic Updates", False },
+    { "menuOptions.Ponder Next Move", False },
+    { "menuHelp.Hint", False },
+    { "menuHelp.Book", False },
+    { NULL, False }
+};
+
+Enables gnuEnables[] = {
+    { "menuMode.ICS Client", False },
+    { "menuMode.ICS Input Box", False },
+    { "menuAction.Accept", False },
+    { "menuAction.Decline", False },
+    { "menuAction.Rematch", False },
+    { "menuAction.Adjourn", False },
+    { "menuAction.Stop Examining", False },
+    { "menuAction.Stop Observing", False },
+    { "menuStep.Revert", False },
+    { "menuOptions.Auto Comment", False },
+    { "menuOptions.Auto Observe", False },
+    { "menuOptions.Auto Raise Board", False },
+    { "menuOptions.Get Move List", False },
+    { "menuOptions.Premove", False },
+    { "menuOptions.Quiet Play", False },
+
+    /* The next two options rely on SetCmailMode being called *after*    */
+    /* SetGNUMode so that when GNU is being used to give hints these     */
+    /* menu options are still available                                  */
+
+    { "menuFile.Mail Move", False },
+    { "menuFile.Reload CMail Message", False },
+    { NULL, False }
+};
+
+Enables cmailEnables[] = {
+    { "Action", True },
+    { "menuAction.Call Flag", False },
+    { "menuAction.Draw", True },
+    { "menuAction.Adjourn", False },
+    { "menuAction.Abort", False },
+    { "menuAction.Stop Observing", False },
+    { "menuAction.Stop Examining", False },
+    { "menuFile.Mail Move", True },
+    { "menuFile.Reload CMail Message", True },
+    { NULL, False }
+};
+
+Enables trainingOnEnables[] = {
+  { "menuMode.Edit Comment", False },
+  { "menuMode.Pause", False },
+  { "menuStep.Forward", False },
+  { "menuStep.Backward", False },
+  { "menuStep.Forward to End", False },
+  { "menuStep.Back to Start", False },
+  { "menuStep.Move Now", False },
+  { "menuStep.Truncate Game", False },
+  { NULL, False }
+};
+
+Enables trainingOffEnables[] = {
+  { "menuMode.Edit Comment", True },
+  { "menuMode.Pause", True },
+  { "menuStep.Forward", True },
+  { "menuStep.Backward", True },
+  { "menuStep.Forward to End", True },
+  { "menuStep.Back to Start", True },
+  { "menuStep.Move Now", True },
+  { "menuStep.Truncate Game", True },
+  { NULL, False }
+};
+
+Enables machineThinkingEnables[] = {
+  { "menuFile.Load Game", False },
+  { "menuFile.Load Next Game", False },
+  { "menuFile.Load Previous Game", False },
+  { "menuFile.Reload Same Game", False },
+  { "menuFile.Paste Game", False },
+  { "menuFile.Load Position", False },
+  { "menuFile.Load Next Position", False },
+  { "menuFile.Load Previous Position", False },
+  { "menuFile.Reload Same Position", False },
+  { "menuFile.Paste Position", False },
+  { "menuMode.Machine White", False },
+  { "menuMode.Machine Black", False },
+  { "menuMode.Two Machines", False },
+  { "menuStep.Retract Move", False },
+  { NULL, False }
+};
+
+Enables userThinkingEnables[] = {
+  { "menuFile.Load Game", True },
+  { "menuFile.Load Next Game", True },
+  { "menuFile.Load Previous Game", True },
+  { "menuFile.Reload Same Game", True },
+  { "menuFile.Paste Game", True },
+  { "menuFile.Load Position", True },
+  { "menuFile.Load Next Position", True },
+  { "menuFile.Load Previous Position", True },
+  { "menuFile.Reload Same Position", True },
+  { "menuFile.Paste Position", True },
+  { "menuMode.Machine White", True },
+  { "menuMode.Machine Black", True },
+  { "menuMode.Two Machines", True },
+  { "menuStep.Retract Move", True },
+  { NULL, False }
+};
+
+
+
 MenuItem fileMenu[] = {
-    {N_("New Game"), ResetProc},
     {N_("New Shuffle Game ..."), ShuffleMenuProc},
     {N_("New Variant ..."), NewVariantProc},      // [HGM] variant: not functional yet
-    {"----", NothingProc},
-    {N_("Load Game"), LoadGameProc},
-    {N_("Load Next Game"), LoadNextGameProc},
-    {N_("Load Previous Game"), LoadPrevGameProc},
-    {N_("Reload Same Game"), ReloadGameProc},
-    {N_("Save Game"), SaveGameProc},
-    {"----", NothingProc},
+    //    {"----", NothingProc},
+    //    {N_("Save Game"), SaveGameProc},
+    //    {"----", NothingProc},
     {N_("Copy Game"), CopyGameProc},
     {N_("Paste Game"), PasteGameProc},
-    {"----", NothingProc},
-    {N_("Load Position"), LoadPositionProc},
-    {N_("Load Next Position"), LoadNextPositionProc},
-    {N_("Load Previous Position"), LoadPrevPositionProc},
-    {N_("Reload Same Position"), ReloadPositionProc},
-    {N_("Save Position"), SavePositionProc},
-    {"----", NothingProc},
+    //    {"----", NothingProc},
+    //    {N_("Load Position"), LoadPositionProc},
+    //    {N_("Load Next Position"), LoadNextPositionProc},
+    //    {N_("Load Previous Position"), LoadPrevPositionProc},
+    //    {N_("Reload Same Position"), ReloadPositionProc},
+    //    {N_("Save Position"), SavePositionProc},
+    //    {"----", NothingProc},
     {N_("Copy Position"), CopyPositionProc},
     {N_("Paste Position"), PastePositionProc},
-    {"----", NothingProc},
+    //    {"----", NothingProc},
     {N_("Mail Move"), MailMoveProc},
     {N_("Reload CMail Message"), ReloadCmailMsgProc},
-    {"----", NothingProc},
-    {N_("Exit"), QuitProc},
+    //    {"----", NothingProc},
     {NULL, NULL}
 };
 
 MenuItem modeMenu[] = {
-    {N_("Machine White"), MachineWhiteProc},
-    {N_("Machine Black"), MachineBlackProc},
-    {N_("Two Machines"), TwoMachinesProc},
+  //    {N_("Machine White"), MachineWhiteProc},
+  //    {N_("Machine Black"), MachineBlackProc},
+  //    {N_("Two Machines"), TwoMachinesProc},
     {N_("Analysis Mode"), AnalyzeModeProc},
-    {N_("Analyze File"), AnalyzeFileProc },
-    {N_("ICS Client"), IcsClientProc},
+    //    {N_("Analyze File"), AnalyzeFileProc },
+    //    {N_("ICS Client"), IcsClientProc},
     {N_("Edit Game"), EditGameProc},
     {N_("Edit Position"), EditPositionProc},
     {N_("Training"), TrainingProc},
@@ -586,139 +630,80 @@ MenuItem modeMenu[] = {
     {N_("Show Engine Output"), EngineOutputProc},
     {N_("Show Evaluation Graph"), NothingProc}, // [HGM] evalgr: not functional yet
     {N_("Show Game List"), ShowGameListProc},
-    {"Show Move History", HistoryShowProc}, // [HGM] hist: activate 4.2.7 code
+    //    {"Show Move History", HistoryShowProc}, // [HGM] hist: activate 4.2.7 code
     {"----", NothingProc},
-    {N_("Edit Tags"), EditTagsProc},
+    //    {N_("Edit Tags"), EditTagsProc},
     {N_("Edit Comment"), EditCommentProc},
     {N_("ICS Input Box"), IcsInputBoxProc},
-    {N_("Pause"), PauseProc},
-    {NULL, NULL}
-};
-
-MenuItem actionMenu[] = {
-    {N_("Accept"), AcceptProc},
-    {N_("Decline"), DeclineProc},
-    {N_("Rematch"), RematchProc},
-    {"----", NothingProc},
-    {N_("Call Flag"), CallFlagProc},
-    {N_("Draw"), DrawProc},
-    {N_("Adjourn"), AdjournProc},
-    {N_("Abort"), AbortProc},
-    {N_("Resign"), ResignProc},
-    {"----", NothingProc},
-    {N_("Stop Observing"), StopObservingProc},
-    {N_("Stop Examining"), StopExaminingProc},
-    {"----", NothingProc},
-    {N_("Adjudicate to White"), AdjuWhiteProc},
-    {N_("Adjudicate to Black"), AdjuBlackProc},
-    {N_("Adjudicate Draw"), AdjuDrawProc},
-    {NULL, NULL}
-};
-
-MenuItem stepMenu[] = {
-    {N_("Backward"), BackwardProc},
-    {N_("Forward"), ForwardProc},
-    {N_("Back to Start"), ToStartProc},
-    {N_("Forward to End"), ToEndProc},
-    {N_("Revert"), RevertProc},
-    {N_("Truncate Game"), TruncateGameProc},
-    {"----", NothingProc},
-    {N_("Move Now"), MoveNowProc},
-    {N_("Retract Move"), RetractMoveProc},
     {NULL, NULL}
 };
 
 MenuItem optionsMenu[] = {
-    {N_("Flip View"), FlipViewProc},
-    {"----", NothingProc},
+  //    {N_("Flip View"), FlipViewProc},
+  //    {"----", NothingProc},
     {N_("Adjudications ..."), EngineMenuProc},
     {N_("General Settings ..."), UciMenuProc},
     {N_("Engine #1 Settings ..."), FirstSettingsProc},
     {N_("Engine #2 Settings ..."), SecondSettingsProc},
     {N_("Time Control ..."), TimeControlProc},
     {"----", NothingProc},
-    {N_("Always Queen"), AlwaysQueenProc},
-    {N_("Animate Dragging"), AnimateDraggingProc},
-    {N_("Animate Moving"), AnimateMovingProc},
-    {N_("Auto Comment"), AutocommProc},
-    {N_("Auto Flag"), AutoflagProc},
-    {N_("Auto Flip View"), AutoflipProc},
-    {N_("Auto Observe"), AutobsProc},
-    {N_("Auto Raise Board"), AutoraiseProc},
-    {N_("Auto Save"), AutosaveProc},
-    {N_("Blindfold"), BlindfoldProc},
-    {N_("Flash Moves"), FlashMovesProc},
-    {N_("Get Move List"), GetMoveListProc},
-#if HIGHDRAG
-    {N_("Highlight Dragging"), HighlightDraggingProc},
-#endif
-    {N_("Highlight Last Move"), HighlightLastMoveProc},
-    {N_("Move Sound"), MoveSoundProc},
-    {N_("ICS Alarm"), IcsAlarmProc},
-    {N_("Old Save Style"), OldSaveStyleProc},
-    {N_("Periodic Updates"), PeriodicUpdatesProc},
+    //    {N_("Always Queen"), AlwaysQueenProc},
+    //    {N_("Animate Dragging"), AnimateDraggingProc},
+    //    {N_("Animate Moving"), AnimateMovingProc},
+    //    {N_("Auto Comment"), AutocommProc},
+    //    {N_("Auto Flag"), AutoflagProc},
+    //    {N_("Auto Flip View"), AutoflipProc},
+    //    {N_("Auto Observe"), AutobsProc},
+    //    {N_("Auto Raise Board"), AutoraiseProc},
+    //    {N_("Auto Save"), AutosaveProc},
+    //    {N_("Blindfold"), BlindfoldProc},
+    //    {N_("Flash Moves"), FlashMovesProc},
+ //    {N_("Get Move List"), GetMoveListProc},
+    //#if HIGHDRAG
+    //    {N_("Highlight Dragging"), HighlightDraggingProc},
+    //#endif
+    //    {N_("Highlight Last Move"), HighlightLastMoveProc},
+    //    {N_("Move Sound"), MoveSoundProc},
+    //    {N_("ICS Alarm"), IcsAlarmProc},
+    //    {N_("Old Save Style"), OldSaveStyleProc},
+    //    {N_("Periodic Updates"), PeriodicUpdatesProc},
     {N_("Ponder Next Move"), PonderNextMoveProc},
     {N_("Popup Exit Message"), PopupExitMessageProc},
     {N_("Popup Move Errors"), PopupMoveErrorsProc},
     {N_("Premove"), PremoveProc},
     {N_("Quiet Play"), QuietPlayProc},
-    {N_("Show Coords"), ShowCoordsProc},
-    {N_("Hide Thinking"), HideThinkingProc},
-    {N_("Test Legality"), TestLegalityProc},
-    {NULL, NULL}
-};
-
-MenuItem helpMenu[] = {
-    {N_("Info XBoard"), InfoProc},
-    {N_("Man XBoard"), ManProc},
-    {"----", NothingProc},
-    {N_("Hint"), HintProc},
-    {N_("Book"), BookProc},
-    {"----", NothingProc},
-    {N_("About XBoard"), AboutProc},
+    //    {N_("Hide Thinking"), HideThinkingProc},
+    //    {N_("Test Legality"), TestLegalityProc},
     {NULL, NULL}
 };
 
 Menu menuBar[] = {
     {N_("File"), fileMenu},
     {N_("Mode"), modeMenu},
-    {N_("Action"), actionMenu},
-    {N_("Step"), stepMenu},
     {N_("Options"), optionsMenu},
-    {N_("Help"), helpMenu},
-    {NULL, NULL}
-};
-
-#define PAUSE_BUTTON N_("P")
-MenuItem buttonBar[] = {
-    {"<<", ToStartProc},
-    {"<", BackwardProc},
-    {PAUSE_BUTTON, PauseProc},
-    {">", ForwardProc},
-    {">>", ToEndProc},
     {NULL, NULL}
 };
 
 #define PIECE_MENU_SIZE 18
 String pieceMenuStrings[2][PIECE_MENU_SIZE] = {
     { N_("White"), "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"),
-      N_("Queen"), N_("King"), "----", N_("Elephant"), N_("Cannon"), 
-      N_("Archbishop"), N_("Chancellor"), "----", N_("Promote"), N_("Demote"), 
+      N_("Queen"), N_("King"), "----", N_("Elephant"), N_("Cannon"),
+      N_("Archbishop"), N_("Chancellor"), "----", N_("Promote"), N_("Demote"),
       N_("Empty square"), N_("Clear board") },
     { N_("Black"), "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"),
-      N_("Queen"), N_("King"), "----", N_("Elephant"), N_("Cannon"), 
-      N_("Archbishop"), N_("Chancellor"), "----", N_("Promote"), N_("Demote"), 
+      N_("Queen"), N_("King"), "----", N_("Elephant"), N_("Cannon"),
+      N_("Archbishop"), N_("Chancellor"), "----", N_("Promote"), N_("Demote"),
       N_("Empty square"), N_("Clear board") }
 };
 /* must be in same order as PieceMenuStrings! */
 ChessSquare pieceMenuTranslation[2][PIECE_MENU_SIZE] = {
     { WhitePlay, (ChessSquare) 0, WhitePawn, WhiteKnight, WhiteBishop,
        WhiteRook, WhiteQueen, WhiteKing, (ChessSquare) 0, WhiteAlfil,
-       WhiteCannon, WhiteAngel, WhiteMarshall, (ChessSquare) 0, 
+       WhiteCannon, WhiteAngel, WhiteMarshall, (ChessSquare) 0,
        PromotePiece, DemotePiece, EmptySquare, ClearBoard },
     { BlackPlay, (ChessSquare) 0, BlackPawn, BlackKnight, BlackBishop,
        BlackRook, BlackQueen, BlackKing, (ChessSquare) 0, BlackAlfil,
-       BlackCannon, BlackAngel, BlackMarshall, (ChessSquare) 0, 
+       BlackCannon, BlackAngel, BlackMarshall, (ChessSquare) 0,
        PromotePiece, DemotePiece, EmptySquare, ClearBoard },
 };
 
@@ -745,15 +730,6 @@ DropMenuEnables dmEnables[] = {
     { 'Q', "Queen" }
 };
 
-Arg shellArgs[] = {
-    { XtNwidth, 0 },
-    { XtNheight, 0 },
-    { XtNminWidth, 0 },
-    { XtNminHeight, 0 },
-    { XtNmaxWidth, 0 },
-    { XtNmaxHeight, 0 }
-};
-
 Arg layoutArgs[] = {
     { XtNborderWidth, 0 },
     { XtNdefaultDistance, 0 },
@@ -770,25 +746,6 @@ Arg boardArgs[] = {
     { XtNheight, 0 }
 };
 
-Arg titleArgs[] = {
-    { XtNjustify, (XtArgVal) XtJustifyRight },
-    { XtNlabel, (XtArgVal) "..." },
-    { XtNresizable, (XtArgVal) True },
-    { XtNresize, (XtArgVal) False }
-};
-
-Arg messageArgs[] = {
-    { XtNjustify, (XtArgVal) XtJustifyLeft },
-    { XtNlabel, (XtArgVal) "..." },
-    { XtNresizable, (XtArgVal) True },
-    { XtNresize, (XtArgVal) False }
-};
-
-Arg timerArgs[] = {
-    { XtNborderWidth, 0 },
-    { XtNjustify, (XtArgVal) XtJustifyLeft }
-};
-
 XtResource clientResources[] = {
     { "whitePieceColor", "whitePieceColor", XtRString, sizeof(String),
        XtOffset(AppDataPtr, whitePieceColor), XtRString,
@@ -1791,109 +1748,99 @@ XrmOptionDescRec shellOptions[] = {
 };
 
 XtActionsRec boardActions[] = {
-    { "DrawPosition", DrawPositionProc },
     { "HandleUserMove", HandleUserMove },
     { "AnimateUserMove", AnimateUserMove },
-    { "FileNameAction", FileNameAction },
+    //    { "FileNameAction", FileNameAction },
     { "AskQuestionProc", AskQuestionProc },
     { "AskQuestionReplyAction", AskQuestionReplyAction },
     { "PieceMenuPopup", PieceMenuPopup },
-    { "WhiteClock", WhiteClock },
-    { "BlackClock", BlackClock },
+    //    { "WhiteClock", WhiteClock },
+    //    { "BlackClock", BlackClock },
     { "Iconify", Iconify },
-    { "ResetProc", ResetProc },
-    { "LoadGameProc", LoadGameProc },
-    { "LoadNextGameProc", LoadNextGameProc },
-    { "LoadPrevGameProc", LoadPrevGameProc },
     { "LoadSelectedProc", LoadSelectedProc },
-    { "ReloadGameProc", ReloadGameProc },
-    { "LoadPositionProc", LoadPositionProc },
-    { "LoadNextPositionProc", LoadNextPositionProc },
-    { "LoadPrevPositionProc", LoadPrevPositionProc },
-    { "ReloadPositionProc", ReloadPositionProc },
+    //    { "LoadPositionProc", LoadPositionProc },
+    //    { "LoadNextPositionProc", LoadNextPositionProc },
+    //    { "LoadPrevPositionProc", LoadPrevPositionProc },
+    //    { "ReloadPositionProc", ReloadPositionProc },
     { "CopyPositionProc", CopyPositionProc },
     { "PastePositionProc", PastePositionProc },
     { "CopyGameProc", CopyGameProc },
     { "PasteGameProc", PasteGameProc },
-    { "SaveGameProc", SaveGameProc },
-    { "SavePositionProc", SavePositionProc },
+    //    { "SaveGameProc", SaveGameProc },
+    //    { "SavePositionProc", SavePositionProc },
     { "MailMoveProc", MailMoveProc },
     { "ReloadCmailMsgProc", ReloadCmailMsgProc },
-    { "QuitProc", QuitProc },
-    { "MachineWhiteProc", MachineWhiteProc },
-    { "MachineBlackProc", MachineBlackProc },
+    //    { "MachineWhiteProc", MachineWhiteProc },
+    //    { "MachineBlackProc", MachineBlackProc },
     { "AnalysisModeProc", AnalyzeModeProc },
-    { "AnalyzeFileProc", AnalyzeFileProc },
-    { "TwoMachinesProc", TwoMachinesProc },
-    { "IcsClientProc", IcsClientProc },
+    //    { "AnalyzeFileProc", AnalyzeFileProc },
+    //    { "TwoMachinesProc", TwoMachinesProc },
+    //    { "IcsClientProc", IcsClientProc },
     { "EditGameProc", EditGameProc },
     { "EditPositionProc", EditPositionProc },
     { "TrainingProc", EditPositionProc },
     { "EngineOutputProc", EngineOutputProc}, // [HGM] Winboard_x engine-output window
     { "ShowGameListProc", ShowGameListProc },
-    { "ShowMoveListProc", HistoryShowProc},
-    { "EditTagsProc", EditCommentProc },
+    //    { "ShowMoveListProc", HistoryShowProc},
+    //    { "EditTagsProc", EditCommentProc },
     { "EditCommentProc", EditCommentProc },
-    { "IcsAlarmProc", IcsAlarmProc },
+    //    { "IcsAlarmProc", IcsAlarmProc },
     { "IcsInputBoxProc", IcsInputBoxProc },
-    { "PauseProc", PauseProc },
-    { "AcceptProc", AcceptProc },
-    { "DeclineProc", DeclineProc },
-    { "RematchProc", RematchProc },
-    { "CallFlagProc", CallFlagProc },
-    { "DrawProc", DrawProc },
-    { "AdjournProc", AdjournProc },
-    { "AbortProc", AbortProc },
-    { "ResignProc", ResignProc },
-    { "AdjuWhiteProc", AdjuWhiteProc },
-    { "AdjuBlackProc", AdjuBlackProc },
-    { "AdjuDrawProc", AdjuDrawProc },
+    //    { "AcceptProc", AcceptProc },
+    //    { "DeclineProc", DeclineProc },
+    //    { "RematchProc", RematchProc },
+    //    { "CallFlagProc", CallFlagProc },
+    //    { "DrawProc", DrawProc },
+    //    { "AdjournProc", AdjournProc },
+    //    { "AbortProc", AbortProc },
+    //    { "ResignProc", ResignProc },
+    //    { "AdjuWhiteProc", AdjuWhiteProc },
+    //    { "AdjuBlackProc", AdjuBlackProc },
+    //    { "AdjuDrawProc", AdjuDrawProc },
     { "EnterKeyProc", EnterKeyProc },
-    { "StopObservingProc", StopObservingProc },
-    { "StopExaminingProc", StopExaminingProc },
-    { "BackwardProc", BackwardProc },
-    { "ForwardProc", ForwardProc },
-    { "ToStartProc", ToStartProc },
-    { "ToEndProc", ToEndProc },
-    { "RevertProc", RevertProc },
-    { "TruncateGameProc", TruncateGameProc },
-    { "MoveNowProc", MoveNowProc },
-    { "RetractMoveProc", RetractMoveProc },
-    { "AlwaysQueenProc", AlwaysQueenProc },
-    { "AnimateDraggingProc", AnimateDraggingProc },
-    { "AnimateMovingProc", AnimateMovingProc },
-    { "AutoflagProc", AutoflagProc },
-    { "AutoflipProc", AutoflipProc },
-    { "AutobsProc", AutobsProc },
-    { "AutoraiseProc", AutoraiseProc },
-    { "AutosaveProc", AutosaveProc },
-    { "BlindfoldProc", BlindfoldProc },
-    { "FlashMovesProc", FlashMovesProc },
-    { "FlipViewProc", FlipViewProc },
-    { "GetMoveListProc", GetMoveListProc },
+    //    { "StopObservingProc", StopObservingProc },
+    //    { "StopExaminingProc", StopExaminingProc },
+    //    { "BackwardProc", BackwardProc },
+    //    { "ForwardProc", ForwardProc },
+    //    { "ToStartProc", ToStartProc },
+    //    { "ToEndProc", ToEndProc },
+    //    { "RevertProc", RevertProc },
+    //    { "TruncateGameProc", TruncateGameProc },
+    //    { "MoveNowProc", MoveNowProc },
+    //    { "RetractMoveProc", RetractMoveProc },
+    //    { "AlwaysQueenProc", AlwaysQueenProc },
+    //    { "AnimateDraggingProc", AnimateDraggingProc },
+    //    { "AnimateMovingProc", AnimateMovingProc },
+    //    { "AutoflagProc", AutoflagProc },
+    //    { "AutoflipProc", AutoflipProc },
+    //    { "AutobsProc", AutobsProc },
+    //    { "AutoraiseProc", AutoraiseProc },
+    //    { "AutosaveProc", AutosaveProc },
+    //    { "BlindfoldProc", BlindfoldProc },
+    //    { "FlashMovesProc", FlashMovesProc },
+    //    { "FlipViewProc", FlipViewProc },
+    //    { "GetMoveListProc", GetMoveListProc },
 #if HIGHDRAG
-    { "HighlightDraggingProc", HighlightDraggingProc },
+    //    { "HighlightDraggingProc", HighlightDraggingProc },
 #endif
-    { "HighlightLastMoveProc", HighlightLastMoveProc },
-    { "IcsAlarmProc", IcsAlarmProc },
-    { "MoveSoundProc", MoveSoundProc },
-    { "OldSaveStyleProc", OldSaveStyleProc },
-    { "PeriodicUpdatesProc", PeriodicUpdatesProc },
+    //    { "HighlightLastMoveProc", HighlightLastMoveProc },
+    //    { "IcsAlarmProc", IcsAlarmProc },
+    //    { "MoveSoundProc", MoveSoundProc },
+    //    { "OldSaveStyleProc", OldSaveStyleProc },
+    //    { "PeriodicUpdatesProc", PeriodicUpdatesProc },
     { "PonderNextMoveProc", PonderNextMoveProc },
     { "PopupExitMessageProc", PopupExitMessageProc },
     { "PopupMoveErrorsProc", PopupMoveErrorsProc },
     { "PremoveProc", PremoveProc },
     { "QuietPlayProc", QuietPlayProc },
-    { "ShowCoordsProc", ShowCoordsProc },
-    { "ShowThinkingProc", ShowThinkingProc },
-    { "HideThinkingProc", HideThinkingProc },
+    //    { "ShowThinkingProc", ShowThinkingProc },
+    //    { "HideThinkingProc", HideThinkingProc },
     { "TestLegalityProc", TestLegalityProc },
-    { "InfoProc", InfoProc },
-    { "ManProc", ManProc },
-    { "HintProc", HintProc },
-    { "BookProc", BookProc },
+    //    { "InfoProc", InfoProc },
+    //    { "ManProc", ManProc },
+    //    { "HintProc", HintProc },
+    //    { "BookProc", BookProc },
     { "AboutGameProc", AboutGameProc },
-    { "AboutProc", AboutProc },
     { "DebugProc", DebugProc },
     { "NothingProc", NothingProc },
     { "CommentPopDown", (XtActionProc) CommentPopDown },
@@ -1901,11 +1848,11 @@ XtActionsRec boardActions[] = {
     { "TagsPopDown", (XtActionProc) TagsPopDown },
     { "ErrorPopDown", (XtActionProc) ErrorPopDown },
     { "ICSInputBoxPopDown", (XtActionProc) ICSInputBoxPopDown },
-    { "FileNamePopDown", (XtActionProc) FileNamePopDown },
+    //    { "FileNamePopDown", (XtActionProc) FileNamePopDown },
     { "AskQuestionPopDown", (XtActionProc) AskQuestionPopDown },
     { "GameListPopDown", (XtActionProc) GameListPopDown },
     { "PromotionPopDown", (XtActionProc) PromotionPopDown },
-    { "HistoryPopDown", (XtActionProc) HistoryPopDown },
+    //    { "HistoryPopDown", (XtActionProc) HistoryPopDown },
     { "EngineOutputPopDown", (XtActionProc) EngineOutputPopDown },
     { "ShufflePopDown", (XtActionProc) ShufflePopDown },
     { "EnginePopDown", (XtActionProc) EnginePopDown },
@@ -1915,196 +1862,17 @@ XtActionsRec boardActions[] = {
     { "SettingsPopDown", (XtActionProc) SettingsPopDown },
 };
 
-char globalTranslations[] =
-  ":<Key>R: ResignProc() \n \
-   :<Key>r: ResetProc() \n \
-   :<Key>g: LoadGameProc() \n \
-   :<Key>N: LoadNextGameProc() \n \
-   :<Key>P: LoadPrevGameProc() \n \
-   :<Key>Q: QuitProc() \n \
-   :<Key>F: ToEndProc() \n \
-   :<Key>f: ForwardProc() \n \
-   :<Key>B: ToStartProc() \n \
-   :<Key>b: BackwardProc() \n \
-   :<Key>p: PauseProc() \n \
-   :<Key>d: DrawProc() \n \
-   :<Key>t: CallFlagProc() \n \
-   :<Key>i: Iconify() \n \
-   :<Key>c: Iconify() \n \
-   :<Key>v: FlipViewProc() \n \
-   <KeyDown>Control_L: BackwardProc() \n \
-   <KeyUp>Control_L: ForwardProc() \n \
-   <KeyDown>Control_R: BackwardProc() \n \
-   <KeyUp>Control_R: ForwardProc() \n \
-   Shift<Key>1: AskQuestionProc(\"Direct command\",\
-                                \"Send to chess program:\",,1) \n \
-   Shift<Key>2: AskQuestionProc(\"Direct command\",\
-                                \"Send to second chess program:\",,2) \n";
-
-char boardTranslations[] =
-   "<Btn1Down>: HandleUserMove() \n \
-   <Btn1Up>: HandleUserMove() \n \
-   <Btn1Motion>: AnimateUserMove() \n \
-   Shift<Btn2Down>: XawPositionSimpleMenu(menuB) XawPositionSimpleMenu(menuD)\
-                 PieceMenuPopup(menuB) \n \
-   Any<Btn2Down>: XawPositionSimpleMenu(menuW) XawPositionSimpleMenu(menuD) \
-                 PieceMenuPopup(menuW) \n \
-   Shift<Btn3Down>: XawPositionSimpleMenu(menuW) XawPositionSimpleMenu(menuD)\
-                 PieceMenuPopup(menuW) \n \
-   Any<Btn3Down>: XawPositionSimpleMenu(menuB) XawPositionSimpleMenu(menuD) \
-                 PieceMenuPopup(menuB) \n";
-
-char whiteTranslations[] = "<BtnDown>: WhiteClock()\n";
-char blackTranslations[] = "<BtnDown>: BlackClock()\n";
 
 char ICSInputTranslations[] =
     "<Key>Return: EnterKeyProc() \n";
 
 String xboardResources[] = {
-    "*fileName*value.translations: #override\\n <Key>Return: FileNameAction()",
+  //    "*fileName*value.translations: #override\\n <Key>Return: FileNameAction()",
     "*question*value.translations: #override\\n <Key>Return: AskQuestionReplyAction()",
     "*errorpopup*translations: #override\\n <Key>Return: ErrorPopDown()",
     NULL
   };
 
-
-/* Max possible square size */
-#define MAXSQSIZE 256
-
-static int xpm_avail[MAXSQSIZE];
-
-#ifdef HAVE_DIR_STRUCT
-
-/* Extract piece size from filename */
-static int
-xpm_getsize(name, len, ext)
-     char *name;
-     int len;
-     char *ext;
-{
-    char *p, *d;
-    char buf[10];
-
-    if (len < 4)
-      return 0;
-
-    if ((p=strchr(name, '.')) == NULL ||
-       StrCaseCmp(p+1, ext) != 0)
-      return 0;
-
-    p = name + 3;
-    d = buf;
-
-    while (*p && isdigit(*p))
-      *(d++) = *(p++);
-
-    *d = 0;
-    return atoi(buf);
-}
-
-/* Setup xpm_avail */
-static int
-xpm_getavail(dirname, ext)
-     char *dirname;
-     char *ext;
-{
-    DIR *dir;
-    struct dirent *ent;
-    int  i;
-
-    for (i=0; i<MAXSQSIZE; ++i)
-      xpm_avail[i] = 0;
-
-    if (appData.debugMode)
-      fprintf(stderr, "XPM dir:%s:ext:%s:\n", dirname, ext);
-
-    dir = opendir(dirname);
-    if (!dir)
-      {
-         fprintf(stderr, _("%s: Can't access XPM directory %s\n"),
-                 programName, dirname);
-         exit(1);
-      }
-
-    while ((ent=readdir(dir)) != NULL) {
-       i = xpm_getsize(ent->d_name, NAMLEN(ent), ext);
-       if (i > 0 && i < MAXSQSIZE)
-         xpm_avail[i] = 1;
-    }
-
-    closedir(dir);
-
-    return 0;
-}
-
-void
-xpm_print_avail(fp, ext)
-     FILE *fp;
-     char *ext;
-{
-    int i;
-
-    fprintf(fp, _("Available `%s' sizes:\n"), ext);
-    for (i=1; i<MAXSQSIZE; ++i) {
-       if (xpm_avail[i])
-         printf("%d\n", i);
-    }
-}
-
-/* Return XPM piecesize closest to size */
-int
-xpm_closest_to(dirname, size, ext)
-     char *dirname;
-     int size;
-     char *ext;
-{
-    int i;
-    int sm_diff = MAXSQSIZE;
-    int sm_index = 0;
-    int diff;
-
-    xpm_getavail(dirname, ext);
-
-    if (appData.debugMode)
-      xpm_print_avail(stderr, ext);
-
-    for (i=1; i<MAXSQSIZE; ++i) {
-       if (xpm_avail[i]) {
-           diff = size - i;
-           diff = (diff<0) ? -diff : diff;
-           if (diff < sm_diff) {
-               sm_diff = diff;
-               sm_index = i;
-           }
-       }
-    }
-
-    if (!sm_index) {
-       fprintf(stderr, _("Error: No `%s' files!\n"), ext);
-       exit(1);
-    }
-
-    return sm_index;
-}
-#else  /* !HAVE_DIR_STRUCT */
-/* If we are on a system without a DIR struct, we can't
-   read the directory, so we can't collect a list of
-   filenames, etc., so we can't do any size-fitting. */
-int
-xpm_closest_to(dirname, size, ext)
-     char *dirname;
-     int size;
-     char *ext;
-{
-    fprintf(stderr, _("\
-Warning: No DIR structure found on this system --\n\
-         Unable to autosize for XPM/XIM pieces.\n\
-   Please report this error to frankm@hiwaay.net.\n\
-   Include system type & operating system in message.\n"));
-    return size;
-}
-#endif /* HAVE_DIR_STRUCT */
-
 static char *cnames[9] = { "black", "red", "green", "yellow", "blue",
                             "magenta", "cyan", "white" };
 typedef struct {
@@ -2195,16 +1963,11 @@ CatchDeleteWindow(Widget w, String procname)
 void
 BoardToTop()
 {
-  Arg args[16];
-  XtSetArg(args[0], XtNiconic, False);
-  XtSetValues(shellWidget, args, 1);
-
-  XtPopup(shellWidget, XtGrabNone); /* Raise if lowered  */
+  /* this should raise the board to the top */
+  gtk_window_present(GTK_WINDOW(GUI_Window));
+  return;
 }
 
-#ifdef IDSIZES
-  // eventually, all layout determining code should go into a subroutine, but until then IDSIZE remains undefined
-#else
 #define BoardSize int
 void InitDrawingSizes(BoardSize boardSize, int flags)
 {   // [HGM] resize is functional now, but for board format changes only (nr of ranks, files)
@@ -2213,68 +1976,29 @@ void InitDrawingSizes(BoardSize boardSize, int flags)
     XtGeometryResult gres;
     int i;
 
-    if(!formWidget) return;
-
-    /*
-     * Enable shell resizing.
-     */
-    shellArgs[0].value = (XtArgVal) &w;
-    shellArgs[1].value = (XtArgVal) &h;
-    XtGetValues(shellWidget, shellArgs, 2);
-
-    shellArgs[4].value = 2*w; shellArgs[2].value = 10;
-    shellArgs[5].value = 2*h; shellArgs[3].value = 10;
-    XtSetValues(shellWidget, &shellArgs[2], 4);
-
-    XtSetArg(args[0], XtNdefaultDistance, &sep);
-    XtGetValues(formWidget, args, 1);
-
-    boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap);
+    boardWidth  = lineGap + BOARD_WIDTH  * (squareSize + lineGap);
     boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap);
-    CreateGrid();
-
-    XtSetArg(args[0], XtNwidth, boardWidth);
-    XtSetArg(args[1], XtNheight, boardHeight);
-    XtSetValues(boardWidget, args, 2);
 
     timerWidth = (boardWidth - sep) / 2;
-    XtSetArg(args[0], XtNwidth, timerWidth);
-    XtSetValues(whiteTimerWidget, args, 1);
-    XtSetValues(blackTimerWidget, args, 1);
 
-    XawFormDoLayout(formWidget, False);
-
-    if (appData.titleInWindow) {
+    if (appData.titleInWindow)
+      {
        i = 0;
-       XtSetArg(args[i], XtNborderWidth, &bor); i++;
-       XtSetArg(args[i], XtNheight, &h);  i++;
-       XtGetValues(titleWidget, args, i);
-       if (smallLayout) {
+       if (smallLayout)
+         {
            w = boardWidth - 2*bor;
-       } else {
-           XtSetArg(args[0], XtNwidth, &w);
-           XtGetValues(menuBarWidget, args, 1);
+         }
+       else
+         {
            w = boardWidth - w - sep - 2*bor - 2; // WIDTH_FUDGE
-       }
-
-       gres = XtMakeResizeRequest(titleWidget, w, h, &wr, &hr);
-       if (gres != XtGeometryYes && appData.debugMode) {
-           fprintf(stderr,
-                   _("%s: titleWidget geometry error %d %d %d %d %d\n"),
-                   programName, gres, w, h, wr, hr);
-       }
-    }
+         }
+      }
 
-    XawFormDoLayout(formWidget, True);
+    if(!formWidget) return;
 
     /*
      * Inhibit shell resizing.
      */
-    shellArgs[0].value = w = (XtArgVal) boardWidth + marginW;
-    shellArgs[1].value = h = (XtArgVal) boardHeight + marginH;
-    shellArgs[4].value = shellArgs[2].value = w;
-    shellArgs[5].value = shellArgs[3].value = h;
-    XtSetValues(shellWidget, &shellArgs[0], 6);
 
     // [HGM] pieces: tailor piece bitmaps to needs of specific variant
     // (only for xpm)
@@ -2336,7 +2060,6 @@ void InitDrawingSizes(BoardSize boardSize, int flags)
     CreateAnimVars();
 #endif
 }
-#endif
 
 void EscapeExpand(char *p, char *q)
 {      // [HGM] initstring: routine to shape up string arguments
@@ -2365,6 +2088,7 @@ main(argc, argv)
     char *p;
     XrmDatabase xdb;
     int forceMono = False;
+
 #define INDIRECTION
 #ifdef INDIRECTION
     // [HGM] before anything else, expand any indirection files amongst options
@@ -2377,7 +2101,7 @@ main(argc, argv)
     j = 0;
     for(i=0; i<argc; i++) {
        if(j >= 1000-2) { printf(_("too many arguments\n")); exit(-1); }
-//fprintf(stderr, "arg %s\n", argv[i]);
+       //fprintf(stderr, "arg %s\n", argv[i]);
        if(argv[i][0] != '@') argvCopy[j++] = argv[i]; else {
            char c;
            FILE *f = fopen(argv[i]+1, "rb");
@@ -2424,10 +2148,61 @@ main(argc, argv)
       XtAppInitialize(&appContext, "XBoard", shellOptions,
                      XtNumber(shellOptions),
                      &argc, argv, xboardResources, NULL, 0);
-    if (argc > 1) 
-      { /* left over command line arguments, print out help and exit.
-        * Use two columns to print help
-        */
+
+    /* set up GTK */
+    gtk_init (&argc, &argv);
+
+    /* parse glade file to build widgets */
+
+    builder = gtk_builder_new ();
+    gtk_builder_add_from_file (builder, "gtk-interface.xml", NULL);
+
+    /* test if everything worked ok */
+
+    GUI_Window = GTK_WIDGET (gtk_builder_get_object (builder, "MainWindow"));
+    if(!GUI_Window) printf("Error: gtk_builder didn't work!\n");
+
+    GUI_Aspect = GTK_WIDGET (gtk_builder_get_object (builder, "Aspectframe"));
+    if(!GUI_Aspect) printf("Error: gtk_builder didn't work!\n");
+
+    GUI_History = GTK_WIDGET (gtk_builder_get_object (builder, "MoveHistory"));
+    if(!GUI_History) printf("Error: gtk_builder didn't work!\n");
+
+    GUI_Menubar  = GTK_WIDGET (gtk_builder_get_object (builder, "MenuBar"));
+    if(!GUI_Menubar) printf("Error: gtk_builder didn't work!\n");
+    GUI_Timer  = GTK_WIDGET (gtk_builder_get_object (builder, "Timer"));
+    if(!GUI_Timer) printf("Error: gtk_builder didn't work!\n");
+    GUI_Buttonbar  = GTK_WIDGET (gtk_builder_get_object (builder, "ButtonBar"));
+    if(!GUI_Buttonbar) printf("Error: gtk_builder didn't work!\n");
+    GUI_Board  = GTK_WIDGET (gtk_builder_get_object (builder, "Board"));
+    if(!GUI_Board) printf("Error: gtk_builder didn't work!\n");
+
+    GUI_Whiteclock  = GTK_WIDGET (gtk_builder_get_object (builder, "WhiteClock"));
+    if(!GUI_Whiteclock) printf("Error: gtk_builder didn't work!\n");
+
+    GUI_Blackclock  = GTK_WIDGET (gtk_builder_get_object (builder, "BlackClock"));
+    if(!GUI_Blackclock) printf("Error: gtk_builder didn't work!\n");
+
+    LIST_MoveHistory = GTK_LIST_STORE (gtk_builder_get_object (builder, "MoveHistoryStore"));
+    if(!LIST_MoveHistory) printf("Error: gtk_builder didn't work!\n");
+
+    /* EditTags window */
+    GUI_EditTags = GTK_WIDGET (gtk_builder_get_object (builder, "EditTags"));
+    if(!GUI_EditTags) printf("Error: gtk_builder didn't work!\n");
+    
+    GUI_EditTagsTextArea = GTK_WIDGET (gtk_builder_get_object (builder, "EditTagsTextArea"));
+    if(!GUI_EditTagsTextArea) printf("Error: gtk_builder didn't work!\n");
+
+
+    gtk_builder_connect_signals (builder, NULL);
+
+    // don't unref the builder, since we use it to get references to widgets
+    //    g_object_unref (G_OBJECT (builder));
+
+    /* end parse glade file */
+
+    if (argc > 1)
+      {
        fprintf(stderr, _("%s: unrecognized argument %s\n"),
                programName, argv[1]);
 
@@ -2500,7 +2275,7 @@ main(argc, argv)
     /* [HGM,HR] make sure board size is acceptable */
     if(appData.NrFiles > BOARD_SIZE ||
        appData.NrRanks > BOARD_SIZE   )
-        DisplayFatalError(_("Recompile with BOARD_SIZE > 12, to support this size"), 0, 2);
+      DisplayFatalError(_("Recompile with BOARD_SIZE > 12, to support this size"), 0, 2);
 
 #if !HIGHDRAG
     /* This feature does not work; animation needs a rewrite */
@@ -2512,58 +2287,69 @@ main(argc, argv)
     xScreen = DefaultScreen(xDisplay);
     wm_delete_window = XInternAtom(xDisplay, "WM_DELETE_WINDOW", True);
 
-       gameInfo.variant = StringToVariant(appData.variant);
-       InitPosition(FALSE);
+    gameInfo.variant = StringToVariant(appData.variant);
+    InitPosition(FALSE);
 
-#ifdef IDSIZE
-    InitDrawingSizes(-1, 0); // [HGM] initsize: make this into a subroutine
-#else
-    if (isdigit(appData.boardSize[0])) {
-        i = sscanf(appData.boardSize, "%d,%d,%d,%d,%d,%d,%d", &squareSize,
+    /* calc board size */
+    if (isdigit(appData.boardSize[0])) 
+      {
+       i = sscanf(appData.boardSize, "%d,%d,%d,%d,%d,%d,%d", &squareSize,
                   &lineGap, &clockFontPxlSize, &coordFontPxlSize,
                   &fontPxlSize, &smallLayout, &tinyLayout);
-        if (i == 0) {
+       if (i == 0) 
+         {
            fprintf(stderr, _("%s: bad boardSize syntax %s\n"),
                    programName, appData.boardSize);
            exit(2);
-       }
-       if (i < 7) {
+         }
+       if (i < 7) 
+         {
            /* Find some defaults; use the nearest known size */
            SizeDefaults *szd, *nearest;
            int distance = 99999;
            nearest = szd = sizeDefaults;
-           while (szd->name != NULL) {
-               if (abs(szd->squareSize - squareSize) < distance) {
+           while (szd->name != NULL) 
+             {
+               if (abs(szd->squareSize - squareSize) < distance) 
+                 {
                    nearest = szd;
                    distance = abs(szd->squareSize - squareSize);
                    if (distance == 0) break;
-               }
+                 }
                szd++;
-           }
+             };
            if (i < 2) lineGap = nearest->lineGap;
            if (i < 3) clockFontPxlSize = nearest->clockFontPxlSize;
            if (i < 4) coordFontPxlSize = nearest->coordFontPxlSize;
            if (i < 5) fontPxlSize = nearest->fontPxlSize;
            if (i < 6) smallLayout = nearest->smallLayout;
            if (i < 7) tinyLayout = nearest->tinyLayout;
-       }
-    } else {
+         }
+      } 
+    else 
+      {
         SizeDefaults *szd = sizeDefaults;
-        if (*appData.boardSize == NULLCHAR) {
-           while (DisplayWidth(xDisplay, xScreen) < szd->minScreenSize ||
-                  DisplayHeight(xDisplay, xScreen) < szd->minScreenSize) {
-             szd++;
-           }
+        if (*appData.boardSize == NULLCHAR) 
+         {
+           while (DisplayWidth(xDisplay, xScreen) < szd->minScreenSize 
+                  || DisplayHeight(xDisplay, xScreen) < szd->minScreenSize) 
+             {
+               szd++;
+             }
            if (szd->name == NULL) szd--;
-       } else {
-           while (szd->name != NULL &&
-                  StrCaseCmp(szd->name, appData.boardSize) != 0) szd++;
-           if (szd->name == NULL) {
+         } 
+       else 
+         {
+           while (szd->name != NULL 
+                  && StrCaseCmp(szd->name, appData.boardSize) != 0) 
+             szd++;
+           if (szd->name == NULL) 
+             {
                fprintf(stderr, _("%s: unrecognized boardSize name %s\n"),
                        programName, appData.boardSize);
                exit(2);
-           }
-       }
+             }
+         }
        squareSize = szd->squareSize;
        lineGap = szd->lineGap;
        clockFontPxlSize = szd->clockFontPxlSize;
@@ -2571,46 +2357,12 @@ main(argc, argv)
        fontPxlSize = szd->fontPxlSize;
        smallLayout = szd->smallLayout;
        tinyLayout = szd->tinyLayout;
-    }
-
-    /* Now, using squareSize as a hint, find a good XPM/XIM set size */
-    if (strlen(appData.pixmapDirectory) > 0) {
-       p = ExpandPathName(appData.pixmapDirectory);
-       if (!p) {
-           fprintf(stderr, _("Error expanding path name \"%s\"\n"),
-                  appData.pixmapDirectory);
-           exit(1);
-       }
-       if (appData.debugMode) {
-          fprintf(stderr, _("\
-XBoard square size (hint): %d\n\
-%s fulldir:%s:\n"), squareSize, IMAGE_EXT, p);
-       }
-       squareSize = xpm_closest_to(p, squareSize, IMAGE_EXT);
-       if (appData.debugMode) {
-           fprintf(stderr, _("Closest %s size: %d\n"), IMAGE_EXT, squareSize);
-       }
-    }
-
-    /* [HR] height treated separately (hacked) */
-    boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap);
+      }
+    /* end figuring out what size to use */
+    
+    boardWidth  = lineGap + BOARD_WIDTH * (squareSize + lineGap);
     boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap);
-    if (appData.showJail == 1) {
-       /* Jail on top and bottom */
-       XtSetArg(boardArgs[1], XtNwidth, boardWidth);
-       XtSetArg(boardArgs[2], XtNheight,
-                boardHeight + 2*(lineGap + squareSize));
-    } else if (appData.showJail == 2) {
-       /* Jail on sides */
-       XtSetArg(boardArgs[1], XtNwidth,
-                boardWidth + 2*(lineGap + squareSize));
-       XtSetArg(boardArgs[2], XtNheight, boardHeight);
-    } else {
-       /* No jail */
-       XtSetArg(boardArgs[1], XtNwidth, boardWidth);
-       XtSetArg(boardArgs[2], XtNheight, boardHeight);
-    }
-
+    
     /*
      * Determine what fonts to use.
      */
@@ -2707,7 +2459,7 @@ XBoard square size (hint): %d\n\
     if (forceMono) {
       fprintf(stderr, _("%s: too few colors available; trying monochrome mode\n"),
              programName);
-      
+
       if (appData.bitmapDirectory == NULL ||
              appData.bitmapDirectory[0] == NULLCHAR)
            appData.bitmapDirectory = DEF_BITMAP_DIR;
@@ -2717,7 +2469,7 @@ XBoard square size (hint): %d\n\
       vFrom.addr = (caddr_t) appData.lowTimeWarningColor;
       vFrom.size = strlen(appData.lowTimeWarningColor);
       XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo);
-      if (vTo.addr == NULL) 
+      if (vTo.addr == NULL)
                appData.monoMode = True;
       else
                lowTimeWarningColor = *(Pixel *) vTo.addr;
@@ -2750,7 +2502,7 @@ XBoard square size (hint): %d\n\
     textColors[ColorNone].fg = textColors[ColorNone].bg = -1;
     textColors[ColorNone].attr = 0;
 
-    XtAppAddActions(appContext, boardActions, XtNumber(boardActions));
+    //    XtAppAddActions(appContext, boardActions, XtNumber(boardActions));
 
     /*
      * widget hierarchy
@@ -2762,428 +2514,152 @@ XBoard square size (hint): %d\n\
     } else {
        layoutName = "normalLayout";
     }
-    /* Outer layoutWidget is there only to provide a name for use in
-       resources that depend on the layout style */
-    layoutWidget =
-      XtCreateManagedWidget(layoutName, formWidgetClass, shellWidget,
-                           layoutArgs, XtNumber(layoutArgs));
-    formWidget =
-      XtCreateManagedWidget("form", formWidgetClass, layoutWidget,
-                           formArgs, XtNumber(formArgs));
-    XtSetArg(args[0], XtNdefaultDistance, &sep);
-    XtGetValues(formWidget, args, 1);
-
-    j = 0;
-    widgetList[j++] = menuBarWidget = CreateMenuBar(menuBar);
-    XtSetArg(args[0], XtNtop,    XtChainTop);
-    XtSetArg(args[1], XtNbottom, XtChainTop);
-    XtSetArg(args[2], XtNright,  XtChainLeft);
-    XtSetValues(menuBarWidget, args, 3);
-
-    widgetList[j++] = whiteTimerWidget =
-      XtCreateWidget("whiteTime", labelWidgetClass,
-                    formWidget, timerArgs, XtNumber(timerArgs));
-    XtSetArg(args[0], XtNfont, clockFontStruct);
-    XtSetArg(args[1], XtNtop,    XtChainTop);
-    XtSetArg(args[2], XtNbottom, XtChainTop);
-    XtSetValues(whiteTimerWidget, args, 3);
-
-    widgetList[j++] = blackTimerWidget =
-      XtCreateWidget("blackTime", labelWidgetClass,
-                    formWidget, timerArgs, XtNumber(timerArgs));
-    XtSetArg(args[0], XtNfont, clockFontStruct);
-    XtSetArg(args[1], XtNtop,    XtChainTop);
-    XtSetArg(args[2], XtNbottom, XtChainTop);
-    XtSetValues(blackTimerWidget, args, 3);
 
     if (appData.titleInWindow) {
-       widgetList[j++] = titleWidget =
-         XtCreateWidget("title", labelWidgetClass, formWidget,
-                        titleArgs, XtNumber(titleArgs));
-       XtSetArg(args[0], XtNtop,    XtChainTop);
-       XtSetArg(args[1], XtNbottom, XtChainTop);
-       XtSetValues(titleWidget, args, 2);
+      /* todo check what this appdata does */
     }
 
     if (appData.showButtonBar) {
-      widgetList[j++] = buttonBarWidget = CreateButtonBar(buttonBar);
-      XtSetArg(args[0], XtNleft,  XtChainRight); // [HGM] glue to right window edge
-      XtSetArg(args[1], XtNright, XtChainRight); //       for good run-time sizing
-      XtSetArg(args[2], XtNtop,    XtChainTop);
-      XtSetArg(args[3], XtNbottom, XtChainTop);
-      XtSetValues(buttonBarWidget, args, 4);
+      /* TODO hide button bar if requested */
     }
 
-    widgetList[j++] = messageWidget =
-      XtCreateWidget("message", labelWidgetClass, formWidget,
-                    messageArgs, XtNumber(messageArgs));
-    XtSetArg(args[0], XtNtop,    XtChainTop);
-    XtSetArg(args[1], XtNbottom, XtChainTop);
-    XtSetValues(messageWidget, args, 2);
 
-    widgetList[j++] = boardWidget =
-      XtCreateWidget("board", widgetClass, formWidget, boardArgs,
-                    XtNumber(boardArgs));
+    if (appData.titleInWindow)
+      {
+       if (smallLayout)
+         {
+           /* make it small */
+           if (appData.showButtonBar)
+             {
+
+             }
+         }
+       else
+         {
+           if (appData.showButtonBar)
+             {
+             }
+         }
+      }
+    else
+      {
+      }
 
-    XtManageChildren(widgetList, j);
 
-    timerWidth = (boardWidth - sep) / 2;
-    XtSetArg(args[0], XtNwidth, timerWidth);
-    XtSetValues(whiteTimerWidget, args, 1);
-    XtSetValues(blackTimerWidget, args, 1);
+    /* set some checkboxes in the menu according to appData */
 
-    XtSetArg(args[0], XtNbackground, &timerBackgroundPixel);
-    XtSetArg(args[1], XtNforeground, &timerForegroundPixel);
-    XtGetValues(whiteTimerWidget, args, 2);
+    if (appData.alwaysPromoteToQueen)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Always Queen")),TRUE);
 
-    if (appData.showButtonBar) {
-      XtSetArg(args[0], XtNbackground, &buttonBackgroundPixel);
-      XtSetArg(args[1], XtNforeground, &buttonForegroundPixel);
-      XtGetValues(XtNameToWidget(buttonBarWidget, PAUSE_BUTTON), args, 2);
-    }
+    if (appData.animateDragging)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Animate Dragging")),TRUE);
 
-    /*
-     * formWidget uses these constraints but they are stored
-     * in the children.
-     */
-    i = 0;
-    XtSetArg(args[i], XtNfromHoriz, 0); i++;
-    XtSetValues(menuBarWidget, args, i);
-    if (appData.titleInWindow) {
-       if (smallLayout) {
-           i = 0;
-           XtSetArg(args[i], XtNfromVert, menuBarWidget); i++;
-           XtSetValues(whiteTimerWidget, args, i);
-           i = 0;
-           XtSetArg(args[i], XtNfromVert, menuBarWidget); i++;
-           XtSetArg(args[i], XtNfromHoriz, whiteTimerWidget); i++;
-           XtSetValues(blackTimerWidget, args, i);
-           i = 0;
-           XtSetArg(args[i], XtNfromVert, whiteTimerWidget); i++;
-            XtSetArg(args[i], XtNjustify, XtJustifyLeft); i++;
-           XtSetValues(titleWidget, args, i);
-           i = 0;
-           XtSetArg(args[i], XtNfromVert, titleWidget); i++;
-           XtSetArg(args[i], XtNresizable, (XtArgVal) True); i++;
-           XtSetValues(messageWidget, args, i);
-           if (appData.showButtonBar) {
-             i = 0;
-             XtSetArg(args[i], XtNfromVert, titleWidget); i++;
-             XtSetArg(args[i], XtNfromHoriz, messageWidget); i++;
-             XtSetValues(buttonBarWidget, args, i);
-           }
-       } else {
-           i = 0;
-           XtSetArg(args[i], XtNfromVert, titleWidget); i++;
-           XtSetValues(whiteTimerWidget, args, i);
-           i = 0;
-           XtSetArg(args[i], XtNfromVert, titleWidget); i++;
-           XtSetArg(args[i], XtNfromHoriz, whiteTimerWidget); i++;
-           XtSetValues(blackTimerWidget, args, i);
-           i = 0;
-           XtSetArg(args[i], XtNfromHoriz, menuBarWidget); i++;
-           XtSetValues(titleWidget, args, i);
-           i = 0;
-           XtSetArg(args[i], XtNfromVert, whiteTimerWidget); i++;
-           XtSetArg(args[i], XtNresizable, (XtArgVal) True); i++;
-           XtSetValues(messageWidget, args, i);
-           if (appData.showButtonBar) {
-             i = 0;
-             XtSetArg(args[i], XtNfromVert, whiteTimerWidget); i++;
-             XtSetArg(args[i], XtNfromHoriz, messageWidget); i++;
-             XtSetValues(buttonBarWidget, args, i);
-           }
-       }
-    } else {
-       i = 0;
-       XtSetArg(args[i], XtNfromVert, menuBarWidget); i++;
-       XtSetValues(whiteTimerWidget, args, i);
-       i = 0;
-       XtSetArg(args[i], XtNfromVert, menuBarWidget); i++;
-       XtSetArg(args[i], XtNfromHoriz, whiteTimerWidget); i++;
-       XtSetValues(blackTimerWidget, args, i);
-       i = 0;
-       XtSetArg(args[i], XtNfromVert, whiteTimerWidget); i++;
-       XtSetArg(args[i], XtNresizable, (XtArgVal) True); i++;
-       XtSetValues(messageWidget, args, i);
-       if (appData.showButtonBar) {
-         i = 0;
-         XtSetArg(args[i], XtNfromVert, whiteTimerWidget); i++;
-         XtSetArg(args[i], XtNfromHoriz, messageWidget); i++;
-         XtSetValues(buttonBarWidget, args, i);
-       }
-    }
-    i = 0;
-    XtSetArg(args[0], XtNfromVert, messageWidget);
-    XtSetArg(args[1], XtNtop,    XtChainTop);
-    XtSetArg(args[2], XtNbottom, XtChainBottom);
-    XtSetArg(args[3], XtNleft,   XtChainLeft);
-    XtSetArg(args[4], XtNright,  XtChainRight);
-    XtSetValues(boardWidget, args, 5);
+    if (appData.animate)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Animate Moving")),TRUE);
 
-    XtRealizeWidget(shellWidget);
+    if (appData.autoComment)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Comment")),TRUE);
 
-    /*
-     * Correct the width of the message and title widgets.
-     * It is not known why some systems need the extra fudge term.
-     * The value "2" is probably larger than needed.
-     */
-    XawFormDoLayout(formWidget, False);
+    if (appData.autoCallFlag)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Flag")),TRUE);
 
-#define WIDTH_FUDGE 2
-    i = 0;
-    XtSetArg(args[i], XtNborderWidth, &bor);  i++;
-    XtSetArg(args[i], XtNheight, &h);  i++;
-    XtGetValues(messageWidget, args, i);
-    if (appData.showButtonBar) {
-      i = 0;
-      XtSetArg(args[i], XtNwidth, &w);  i++;
-      XtGetValues(buttonBarWidget, args, i);
-      w = boardWidth - w - sep - 2*bor - WIDTH_FUDGE;
-    } else {
-      w = boardWidth - 2*bor + 1; /*!! +1 compensates for kludge below */
-    }
+    if (appData.autoFlipView)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Flip View")),TRUE);
 
-    gres = XtMakeResizeRequest(messageWidget, w, h, &wr, &hr);
-    if (gres != XtGeometryYes && appData.debugMode) {
-      fprintf(stderr, _("%s: messageWidget geometry error %d %d %d %d %d\n"),
-             programName, gres, w, h, wr, hr);
-    }
+    if (appData.autoObserve)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Observe")),TRUE);
 
-    /* !! Horrible hack to work around bug in XFree86 4.0.1 (X11R6.4.3) */
-    /* The size used for the child widget in layout lags one resize behind
-       its true size, so we resize a second time, 1 pixel smaller.  Yeech! */
-    w--;
-    gres = XtMakeResizeRequest(messageWidget, w, h, &wr, &hr);
-    if (gres != XtGeometryYes && appData.debugMode) {
-      fprintf(stderr, _("%s: messageWidget geometry error %d %d %d %d %d\n"),
-             programName, gres, w, h, wr, hr);
-    }
-    /* !! end hack */
-    XtSetArg(args[0], XtNleft,  XtChainLeft);  // [HGM] glue ends for good run-time sizing
-    XtSetArg(args[1], XtNright, XtChainRight);
-    XtSetValues(messageWidget, args, 2);
+    if (appData.autoRaiseBoard)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Raise Board")),TRUE);
 
-    if (appData.titleInWindow) {
-       i = 0;
-       XtSetArg(args[i], XtNborderWidth, &bor); i++;
-       XtSetArg(args[i], XtNheight, &h);  i++;
-       XtGetValues(titleWidget, args, i);
-       if (smallLayout) {
-           w = boardWidth - 2*bor;
-       } else {
-           XtSetArg(args[0], XtNwidth, &w);
-           XtGetValues(menuBarWidget, args, 1);
-           w = boardWidth - w - sep - 2*bor - WIDTH_FUDGE;
-       }
+    if (appData.autoSaveGames)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Save")),TRUE);
 
-       gres = XtMakeResizeRequest(titleWidget, w, h, &wr, &hr);
-       if (gres != XtGeometryYes && appData.debugMode) {
-           fprintf(stderr,
-                   _("%s: titleWidget geometry error %d %d %d %d %d\n"),
-                   programName, gres, w, h, wr, hr);
-       }
-    }
-    XawFormDoLayout(formWidget, True);
+    if (appData.saveGameFile[0] != NULLCHAR)
+      {
+       /* Can't turn this off from menu */
+       gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Auto Save")),TRUE);
+       gtk_action_set_sensitive(GTK_ACTION (gtk_builder_get_object (builder, "menuOptions.Auto Save")),FALSE);
+      }
 
-    xBoardWindow = XtWindow(boardWidget);
+    if (appData.blindfold)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Blindfold")),TRUE);
 
-    // [HGM] it seems the layout code ends here, but perhaps the color stuff is size independent and would
-    //       not need to go into InitDrawingSizes().
-#endif
+    if (appData.flashCount > 0)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Flash Moves")),TRUE);
 
-    /*
-     * Create X checkmark bitmap and initialize option menu checks.
-     */
-    ReadBitmap(&xMarkPixmap, "checkmark.bm",
-              checkmark_bits, checkmark_width, checkmark_height);
-    XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    if (appData.alwaysPromoteToQueen) {
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Always Queen"),
-                   args, 1);
-    }
-    if (appData.animateDragging) {
-       XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Animate Dragging"),
-                   args, 1);
-    }
-    if (appData.animate) {
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Animate Moving"),
-                   args, 1);
-    }
-    if (appData.autoComment) {
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Comment"),
-                   args, 1);
-    }
-    if (appData.autoCallFlag) {
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Flag"),
-                   args, 1);
-    }
-    if (appData.autoFlipView) {
-       XtSetValues(XtNameToWidget(menuBarWidget,"menuOptions.Auto Flip View"),
-                   args, 1);
-    }
-    if (appData.autoObserve) {
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Observe"),
-                   args, 1);
-    }
-    if (appData.autoRaiseBoard) {
-       XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Auto Raise Board"), args, 1);
-    }
-    if (appData.autoSaveGames) {
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Save"),
-                   args, 1);
-    }
-    if (appData.saveGameFile[0] != NULLCHAR) {
-       /* Can't turn this off from menu */
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Save"),
-                   args, 1);
-       XtSetSensitive(XtNameToWidget(menuBarWidget, "menuOptions.Auto Save"),
-                      False);
+    if (appData.getMoveList)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Get Move List")),TRUE);
 
-    }
-    if (appData.blindfold) {
-       XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Blindfold"), args, 1);
-    }
-    if (appData.flashCount > 0) {
-       XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Flash Moves"),
-                   args, 1);
-    }
-    if (appData.getMoveList) {
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Get Move List"),
-                   args, 1);
-    }
 #if HIGHDRAG
-    if (appData.highlightDragging) {
-       XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Highlight Dragging"),
-                   args, 1);
-    }
+    if (appData.highlightDragging)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Highlight Dragging")),TRUE);
 #endif
-    if (appData.highlightLastMove) {
-       XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Highlight Last Move"),
-                   args, 1);
-    }
-    if (appData.icsAlarm) {
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.ICS Alarm"),
-                   args, 1);
-    }
-    if (appData.ringBellAfterMoves) {
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Move Sound"),
-                   args, 1);
-    }
-    if (appData.oldSaveStyle) {
-       XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Old Save Style"), args, 1);
-    }
-    if (appData.periodicUpdates) {
-       XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Periodic Updates"), args, 1);
-    }
-    if (appData.ponderNextMove) {
-       XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Ponder Next Move"), args, 1);
-    }
-    if (appData.popupExitMessage) {
-       XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Popup Exit Message"), args, 1);
-    }
-    if (appData.popupMoveErrors) {
-       XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Popup Move Errors"), args, 1);
-    }
-    if (appData.premove) {
-       XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Premove"), args, 1);
-    }
-    if (appData.quietPlay) {
-       XtSetValues(XtNameToWidget(menuBarWidget,
-                                  "menuOptions.Quiet Play"), args, 1);
-    }
-    if (appData.showCoords) {
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Show Coords"),
-                   args, 1);
-    }
-    if (appData.hideThinkingFromHuman) {
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Hide Thinking"),
-                   args, 1);
-    }
-    if (appData.testLegality) {
-       XtSetValues(XtNameToWidget(menuBarWidget,"menuOptions.Test Legality"),
-                   args, 1);
-    }
 
-    /*
-     * Create an icon.
-     */
-    ReadBitmap(&wIconPixmap, "icon_white.bm",
-              icon_white_bits, icon_white_width, icon_white_height);
-    ReadBitmap(&bIconPixmap, "icon_black.bm",
-              icon_black_bits, icon_black_width, icon_black_height);
-    iconPixmap = wIconPixmap;
-    i = 0;
-    XtSetArg(args[i], XtNiconPixmap, iconPixmap);  i++;
-    XtSetValues(shellWidget, args, i);
+    if (appData.highlightLastMove)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Highlight Last Move")),TRUE);
 
-    /*
-     * Create a cursor for the board widget.
-     */
-    window_attributes.cursor = XCreateFontCursor(xDisplay, XC_hand2);
-    XChangeWindowAttributes(xDisplay, xBoardWindow,
-                           CWCursor, &window_attributes);
+    if (appData.icsAlarm)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.ICS Alarm")),TRUE);
 
-    /*
-     * Inhibit shell resizing.
-     */
-    shellArgs[0].value = (XtArgVal) &w;
-    shellArgs[1].value = (XtArgVal) &h;
-    XtGetValues(shellWidget, shellArgs, 2);
-    shellArgs[4].value = shellArgs[2].value = w;
-    shellArgs[5].value = shellArgs[3].value = h;
-    XtSetValues(shellWidget, &shellArgs[2], 4);
-    marginW =  w - boardWidth; // [HGM] needed to set new shellWidget size when we resize board
-    marginH =  h - boardHeight;
+    if (appData.ringBellAfterMoves)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Move Sound")),TRUE);
 
-    CatchDeleteWindow(shellWidget, "QuitProc");
+    if (appData.oldSaveStyle)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Old Save Style")),TRUE);
 
-    CreateGCs();
-    CreateGrid();
-#if HAVE_LIBXPM
-    if (appData.bitmapDirectory[0] != NULLCHAR) {
-      CreatePieces();
-    } else {
-      CreateXPMPieces();
-    }
-#else
-    CreateXIMPieces();
-    /* Create regular pieces */
-    if (!useImages) CreatePieces();
-#endif
+    if (appData.periodicUpdates)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Periodic Updates")),TRUE);
+
+    if (appData.ponderNextMove)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Ponder Next Move")),TRUE);
+
+    if (appData.popupExitMessage)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Popup Exit Message")),TRUE);
+
+    if (appData.popupMoveErrors)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Popup Move Errors")),TRUE);
+
+    if (appData.premove)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Premove")),TRUE);
+
+    if (appData.quietPlay)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Quit Play")),TRUE);
+
+    if (appData.showCoords)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Show Coords")),TRUE);
 
+    if (appData.showThinking)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Show Thinking")),TRUE);
+
+    if (appData.testLegality)
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuOptions.Test Legality")),TRUE);
+
+    /* end setting check boxes */
+
+    /* load square colors */
+    SVGLightSquare   = load_pixbuf("svg/LightSquare.svg",squareSize);
+    SVGDarkSquare    = load_pixbuf("svg/DarkSquare.svg",squareSize);
+    SVGNeutralSquare = load_pixbuf("svg/NeutralSquare.svg",squareSize);
+
+    /* use two icons to indicate if it is white's or black's turn */
+    WhiteIcon  = load_pixbuf("svg/icon_white.svg",0);
+    BlackIcon  = load_pixbuf("svg/icon_black.svg",0);
+    WindowIcon = WhiteIcon;
+    gtk_window_set_icon(GTK_WINDOW(GUI_Window),WindowIcon);
+
+
+    /* realize window */
+    gtk_widget_show (GUI_Window);
+
+    /* recalc boardsize */
+    CreateGCs();
+    CreatePieces();
     CreatePieceMenus();
 
     if (appData.animate || appData.animateDragging)
       CreateAnimVars();
 
-    XtAugmentTranslations(formWidget,
-                         XtParseTranslationTable(globalTranslations));
-    XtAugmentTranslations(boardWidget,
-                         XtParseTranslationTable(boardTranslations));
-    XtAugmentTranslations(whiteTimerWidget,
-                         XtParseTranslationTable(whiteTranslations));
-    XtAugmentTranslations(blackTimerWidget,
-                         XtParseTranslationTable(blackTranslations));
-
-    /* Why is the following needed on some versions of X instead
-     * of a translation? */
-    XtAddEventHandler(boardWidget, ExposureMask, False,
-                     (XtEventHandler) EventProc, NULL);
-    /* end why */
-
     InitBackEnd2();
 
     if (errorExitStatus == -1) {
@@ -3206,7 +2682,18 @@ XBoard square size (hint): %d\n\
     gameInfo.boardWidth = 0; // [HGM] pieces: kludge to ensure InitPosition() calls InitDrawingSizes()
     InitPosition(TRUE);
 
-    XtAppMainLoop(appContext);
+    /*
+     * Create a cursor for the board widget.
+     * (This needs to be called after the window has been created to have access to board-window)
+     */
+
+    BoardCursor = gdk_cursor_new(GDK_HAND2);
+    gdk_window_set_cursor(GUI_Board->window, BoardCursor);
+    gdk_cursor_destroy(BoardCursor);
+
+    /* end cursor */
+    gtk_main ();
+
     if (appData.debugMode) fclose(debugFP); // [DM] debug
     return 0;
 }
@@ -3292,184 +2779,35 @@ ResetFrontEnd()
     return;
 }
 
-typedef struct {
-    char *name;
-    Boolean value;
-} Enables;
-
 void
 SetMenuEnables(enab)
      Enables *enab;
 {
-  Widget w;
-  if (!menuBarWidget) return;
+  GObject *o;
+
+  if (!builder) return;
   while (enab->name != NULL) {
-    w = XtNameToWidget(menuBarWidget, enab->name);
-    if (w == NULL) {
-      DisplayError(enab->name, 0);
-    } else {
-      XtSetSensitive(w, enab->value);
-    }
+    o = gtk_builder_get_object(builder, enab->name);
+    if(GTK_IS_WIDGET(o))
+      gtk_widget_set_sensitive(GTK_WIDGET (o),enab->value);
+    else
+      {
+       if(GTK_IS_ACTION(o))
+         gtk_action_set_sensitive(GTK_ACTION (o),enab->value);
+       else
+         DisplayError(enab->name, 0);
+      }
     enab++;
   }
 }
 
-Enables icsEnables[] = {
-    { "menuFile.Mail Move", False },
-    { "menuFile.Reload CMail Message", False },
-    { "menuMode.Machine Black", False },
-    { "menuMode.Machine White", False },
-    { "menuMode.Analysis Mode", False },
-    { "menuMode.Analyze File", False },
-    { "menuMode.Two Machines", False },
-#ifndef ZIPPY
-    { "menuHelp.Hint", False },
-    { "menuHelp.Book", False },
-    { "menuStep.Move Now", False },
-    { "menuOptions.Periodic Updates", False },
-    { "menuOptions.Hide Thinking", False },
-    { "menuOptions.Ponder Next Move", False },
-#endif
-    { NULL, False }
-};
-
-Enables ncpEnables[] = {
-    { "menuFile.Mail Move", False },
-    { "menuFile.Reload CMail Message", False },
-    { "menuMode.Machine White", False },
-    { "menuMode.Machine Black", False },
-    { "menuMode.Analysis Mode", False },
-    { "menuMode.Analyze File", False },
-    { "menuMode.Two Machines", False },
-    { "menuMode.ICS Client", False },
-    { "menuMode.ICS Input Box", False },
-    { "Action", False },
-    { "menuStep.Revert", False },
-    { "menuStep.Move Now", False },
-    { "menuStep.Retract Move", False },
-    { "menuOptions.Auto Comment", False },
-    { "menuOptions.Auto Flag", False },
-    { "menuOptions.Auto Flip View", False },
-    { "menuOptions.Auto Observe", False },
-    { "menuOptions.Auto Raise Board", False },
-    { "menuOptions.Get Move List", False },
-    { "menuOptions.ICS Alarm", False },
-    { "menuOptions.Move Sound", False },
-    { "menuOptions.Quiet Play", False },
-    { "menuOptions.Hide Thinking", False },
-    { "menuOptions.Periodic Updates", False },
-    { "menuOptions.Ponder Next Move", False },
-    { "menuHelp.Hint", False },
-    { "menuHelp.Book", False },
-    { NULL, False }
-};
-
-Enables gnuEnables[] = {
-    { "menuMode.ICS Client", False },
-    { "menuMode.ICS Input Box", False },
-    { "menuAction.Accept", False },
-    { "menuAction.Decline", False },
-    { "menuAction.Rematch", False },
-    { "menuAction.Adjourn", False },
-    { "menuAction.Stop Examining", False },
-    { "menuAction.Stop Observing", False },
-    { "menuStep.Revert", False },
-    { "menuOptions.Auto Comment", False },
-    { "menuOptions.Auto Observe", False },
-    { "menuOptions.Auto Raise Board", False },
-    { "menuOptions.Get Move List", False },
-    { "menuOptions.Premove", False },
-    { "menuOptions.Quiet Play", False },
-
-    /* The next two options rely on SetCmailMode being called *after*    */
-    /* SetGNUMode so that when GNU is being used to give hints these     */
-    /* menu options are still available                                  */
-
-    { "menuFile.Mail Move", False },
-    { "menuFile.Reload CMail Message", False },
-    { NULL, False }
-};
-
-Enables cmailEnables[] = {
-    { "Action", True },
-    { "menuAction.Call Flag", False },
-    { "menuAction.Draw", True },
-    { "menuAction.Adjourn", False },
-    { "menuAction.Abort", False },
-    { "menuAction.Stop Observing", False },
-    { "menuAction.Stop Examining", False },
-    { "menuFile.Mail Move", True },
-    { "menuFile.Reload CMail Message", True },
-    { NULL, False }
-};
-
-Enables trainingOnEnables[] = {
-  { "menuMode.Edit Comment", False },
-  { "menuMode.Pause", False },
-  { "menuStep.Forward", False },
-  { "menuStep.Backward", False },
-  { "menuStep.Forward to End", False },
-  { "menuStep.Back to Start", False },
-  { "menuStep.Move Now", False },
-  { "menuStep.Truncate Game", False },
-  { NULL, False }
-};
-
-Enables trainingOffEnables[] = {
-  { "menuMode.Edit Comment", True },
-  { "menuMode.Pause", True },
-  { "menuStep.Forward", True },
-  { "menuStep.Backward", True },
-  { "menuStep.Forward to End", True },
-  { "menuStep.Back to Start", True },
-  { "menuStep.Move Now", True },
-  { "menuStep.Truncate Game", True },
-  { NULL, False }
-};
-
-Enables machineThinkingEnables[] = {
-  { "menuFile.Load Game", False },
-  { "menuFile.Load Next Game", False },
-  { "menuFile.Load Previous Game", False },
-  { "menuFile.Reload Same Game", False },
-  { "menuFile.Paste Game", False },
-  { "menuFile.Load Position", False },
-  { "menuFile.Load Next Position", False },
-  { "menuFile.Load Previous Position", False },
-  { "menuFile.Reload Same Position", False },
-  { "menuFile.Paste Position", False },
-  { "menuMode.Machine White", False },
-  { "menuMode.Machine Black", False },
-  { "menuMode.Two Machines", False },
-  { "menuStep.Retract Move", False },
-  { NULL, False }
-};
-
-Enables userThinkingEnables[] = {
-  { "menuFile.Load Game", True },
-  { "menuFile.Load Next Game", True },
-  { "menuFile.Load Previous Game", True },
-  { "menuFile.Reload Same Game", True },
-  { "menuFile.Paste Game", True },
-  { "menuFile.Load Position", True },
-  { "menuFile.Load Next Position", True },
-  { "menuFile.Load Previous Position", True },
-  { "menuFile.Reload Same Position", True },
-  { "menuFile.Paste Position", True },
-  { "menuMode.Machine White", True },
-  { "menuMode.Machine Black", True },
-  { "menuMode.Two Machines", True },
-  { "menuStep.Retract Move", True },
-  { NULL, False }
-};
-
 void SetICSMode()
 {
   SetMenuEnables(icsEnables);
 
 #ifdef ZIPPY
   if (appData.zippyPlay && !appData.noChessProgram)   /* [DM] icsEngineAnalyze */
-     XtSetSensitive(XtNameToWidget(menuBarWidget, "menuMode.Analysis Mode"), True);
+    {}; //     XtSetSensitive(XtNameToWidget(menuBarWidget, "menuMode.Analysis Mode"), True);
 #endif
 }
 
@@ -3496,7 +2834,7 @@ SetTrainingModeOn()
 {
   SetMenuEnables(trainingOnEnables);
   if (appData.showButtonBar) {
-    XtSetSensitive(buttonBarWidget, False);
+    //    XtSetSensitive(buttonBarWidget, False);
   }
   CommentPopDown();
 }
@@ -3506,7 +2844,7 @@ SetTrainingModeOff()
 {
   SetMenuEnables(trainingOffEnables);
   if (appData.showButtonBar) {
-    XtSetSensitive(buttonBarWidget, True);
+    //    XtSetSensitive(buttonBarWidget, True);
   }
 }
 
@@ -3526,8 +2864,8 @@ SetMachineThinkingEnables()
   case MachinePlaysBlack:
   case MachinePlaysWhite:
   case TwoMachinesPlay:
-    XtSetSensitive(XtNameToWidget(menuBarWidget,
-                                 ModeToWidgetName(gameMode)), True);
+//    XtSetSensitive(XtNameToWidget(menuBarWidget,
+//                               ModeToWidgetName(gameMode)), True);
     break;
   default:
     break;
@@ -3638,6 +2976,8 @@ char *FindFont(pattern, targetPxlSize)
 
 void CreateGCs()
 {
+  /* GCs are not needed anymore for GTK  just left them in here for the moment, since there is a lot of X-code still around that's wants them*/
+
     XtGCMask value_mask = GCLineWidth | GCLineStyle | GCForeground
       | GCBackground | GCFunction | GCPlaneMask;
     XGCValues gc_values;
@@ -3649,26 +2989,12 @@ void CreateGCs()
     gc_values.function = GXcopy;
 
     gc_values.foreground = XBlackPixel(xDisplay, xScreen);
-    gc_values.background = XBlackPixel(xDisplay, xScreen);
-    lineGC = XtGetGC(shellWidget, value_mask, &gc_values);
-
-    gc_values.foreground = XBlackPixel(xDisplay, xScreen);
     gc_values.background = XWhitePixel(xDisplay, xScreen);
     coordGC = XtGetGC(shellWidget, value_mask, &gc_values);
     XSetFont(xDisplay, coordGC, coordFontID);
 
-    // [HGM] make font for holdings counts (white on black0
-    gc_values.foreground = XWhitePixel(xDisplay, xScreen);
-    gc_values.background = XBlackPixel(xDisplay, xScreen);
-    countGC = XtGetGC(shellWidget, value_mask, &gc_values);
-    XSetFont(xDisplay, countGC, countFontID);
-
     if (appData.monoMode) {
        gc_values.foreground = XWhitePixel(xDisplay, xScreen);
-       gc_values.background = XWhitePixel(xDisplay, xScreen);
-       highlineGC = XtGetGC(shellWidget, value_mask, &gc_values);
-
-       gc_values.foreground = XWhitePixel(xDisplay, xScreen);
        gc_values.background = XBlackPixel(xDisplay, xScreen);
        lightSquareGC = wbPieceGC
          = XtGetGC(shellWidget, value_mask, &gc_values);
@@ -3692,14 +3018,6 @@ void CreateGCs()
            }
        }
     } else {
-       gc_values.foreground = highlightSquareColor;
-       gc_values.background = highlightSquareColor;
-       highlineGC = XtGetGC(shellWidget, value_mask, &gc_values);
-
-       gc_values.foreground = premoveHighlightColor;
-       gc_values.background = premoveHighlightColor;
-       prelineGC = XtGetGC(shellWidget, value_mask, &gc_values);
-
        gc_values.foreground = lightSquareColor;
        gc_values.background = darkSquareColor;
        lightSquareGC = XtGetGC(shellWidget, value_mask, &gc_values);
@@ -3738,447 +3056,49 @@ void CreateGCs()
     }
 }
 
-void loadXIM(xim, xmask, filename, dest, mask)
-     XImage *xim;
-     XImage *xmask;
-     char *filename;
-     Pixmap *dest;
-     Pixmap *mask;
-{
-    int x, y, w, h, p;
-    FILE *fp;
-    Pixmap temp;
-    XGCValues  values;
-    GC maskGC;
-
-    fp = fopen(filename, "rb");
-    if (!fp) {
-       fprintf(stderr, _("%s: error loading XIM!\n"), programName);
-       exit(1);
-    }
-
-    w = fgetc(fp);
-    h = fgetc(fp);
-
-    for (y=0; y<h; ++y) {
-       for (x=0; x<h; ++x) {
-           p = fgetc(fp);
-
-           switch (p) {
-             case 0:
-               XPutPixel(xim, x, y, blackPieceColor);
-               if (xmask)
-                 XPutPixel(xmask, x, y, WhitePixel(xDisplay,xScreen));
-               break;
-             case 1:
-               XPutPixel(xim, x, y, darkSquareColor);
-               if (xmask)
-                 XPutPixel(xmask, x, y, BlackPixel(xDisplay,xScreen));
-               break;
-             case 2:
-               XPutPixel(xim, x, y, whitePieceColor);
-               if (xmask)
-                 XPutPixel(xmask, x, y, WhitePixel(xDisplay,xScreen));
-               break;
-             case 3:
-               XPutPixel(xim, x, y, lightSquareColor);
-               if (xmask)
-                 XPutPixel(xmask, x, y, BlackPixel(xDisplay,xScreen));
-               break;
-           }
-       }
-    }
-
-    /* create Pixmap of piece */
-    *dest = XCreatePixmap(xDisplay, DefaultRootWindow(xDisplay),
-                         w, h, xim->depth);
-    XPutImage(xDisplay, *dest, lightSquareGC, xim,
-             0, 0, 0, 0, w, h);
-
-    /* create Pixmap of clipmask
-       Note: We assume the white/black pieces have the same
-             outline, so we make only 6 masks. This is okay
-             since the XPM clipmask routines do the same. */
-    if (xmask) {
-      temp = XCreatePixmap(xDisplay, DefaultRootWindow(xDisplay),
-                           w, h, xim->depth);
-      XPutImage(xDisplay, temp, lightSquareGC, xmask,
-             0, 0, 0, 0, w, h);
-
-      /* now create the 1-bit version */
-      *mask = XCreatePixmap(xDisplay, DefaultRootWindow(xDisplay),
-                         w, h, 1);
-
-      values.foreground = 1;
-      values.background = 0;
-
-      /* Don't use XtGetGC, not read only */
-      maskGC = XCreateGC(xDisplay, *mask,
-                   GCForeground | GCBackground, &values);
-      XCopyPlane(xDisplay, temp, *mask, maskGC,
-                 0, 0, squareSize, squareSize, 0, 0, 1);
-      XFreePixmap(xDisplay, temp);
-    }
-}
-
-
-char pieceBitmapNames[] = "pnbrqfeacwmohijgdvlsukpnsl";
-
-void CreateXIMPieces()
-{
-    int piece, kind;
-    char buf[MSG_SIZ];
-    u_int ss;
-    static char *ximkind[] = { "ll", "ld", "dl", "dd" };
-    XImage *ximtemp;
-
-    ss = squareSize;
-
-    /* The XSynchronize calls were copied from CreatePieces.
-       Not sure if needed, but can't hurt */
-    XSynchronize(xDisplay, True); /* Work-around for xlib/xt
-                                    buffering bug */
-
-    /* temp needed by loadXIM() */
-    ximtemp = XGetImage(xDisplay, DefaultRootWindow(xDisplay),
-                0, 0, ss, ss, AllPlanes, XYPixmap);
-
-    if (strlen(appData.pixmapDirectory) == 0) {
-      useImages = 0;
-    } else {
-       useImages = 1;
-       if (appData.monoMode) {
-         DisplayFatalError(_("XIM pieces cannot be used in monochrome mode"),
-                           0, 2);
-         ExitEvent(2);
-       }
-       fprintf(stderr, _("\nLoading XIMs...\n"));
-       /* Load pieces */
-       for (piece = (int) WhitePawn; piece <= (int) WhiteKing + 4; piece++) {
-           fprintf(stderr, "%d", piece+1);
-           for (kind=0; kind<4; kind++) {
-               fprintf(stderr, ".");
-               snprintf(buf, sizeof(buf), "%s/%s%c%s%u.xim",
-                       ExpandPathName(appData.pixmapDirectory),
-                       piece <= (int) WhiteKing ? "" : "w",
-                       pieceBitmapNames[piece],
-                       ximkind[kind], ss);
-               ximPieceBitmap[kind][piece] =
-                 XGetImage(xDisplay, DefaultRootWindow(xDisplay),
-                           0, 0, ss, ss, AllPlanes, XYPixmap);
-               if (appData.debugMode)
-                 fprintf(stderr, _("(File:%s:) "), buf);
-               loadXIM(ximPieceBitmap[kind][piece],
-                       ximtemp, buf,
-                       &(xpmPieceBitmap2[kind][piece]),
-                       &(ximMaskPm2[piece]));
-               if(piece <= (int)WhiteKing)
-                   xpmPieceBitmap[kind][piece] = xpmPieceBitmap2[kind][piece];
-           }
-           fprintf(stderr," ");
-       }
-       /* Load light and dark squares */
-       /* If the LSQ and DSQ pieces don't exist, we will
-          draw them with solid squares. */
-       snprintf(buf,sizeof(buf), "%s/lsq%u.xim", ExpandPathName(appData.pixmapDirectory), ss);
-       if (access(buf, 0) != 0) {
-           useImageSqs = 0;
-       } else {
-           useImageSqs = 1;
-           fprintf(stderr, _("light square "));
-           ximLightSquare=
-             XGetImage(xDisplay, DefaultRootWindow(xDisplay),
-                       0, 0, ss, ss, AllPlanes, XYPixmap);
-           if (appData.debugMode)
-             fprintf(stderr, _("(File:%s:) "), buf);
-
-           loadXIM(ximLightSquare, NULL, buf, &xpmLightSquare, NULL);
-           fprintf(stderr, _("dark square "));
-           snprintf(buf,sizeof(buf), "%s/dsq%u.xim",
-                   ExpandPathName(appData.pixmapDirectory), ss);
-           if (appData.debugMode)
-             fprintf(stderr, _("(File:%s:) "), buf);
-           ximDarkSquare=
-             XGetImage(xDisplay, DefaultRootWindow(xDisplay),
-                       0, 0, ss, ss, AllPlanes, XYPixmap);
-           loadXIM(ximDarkSquare, NULL, buf, &xpmDarkSquare, NULL);
-           xpmJailSquare = xpmLightSquare;
-       }
-       fprintf(stderr, _("Done.\n"));
-    }
-    XSynchronize(xDisplay, False); /* Work-around for xlib/xt buffering bug */
-}
-
-#if HAVE_LIBXPM
-void CreateXPMPieces()
-{
-    int piece, kind, r;
-    char buf[MSG_SIZ];
-    u_int ss = squareSize;
-    XpmAttributes attr;
-    static char *xpmkind[] = { "ll", "ld", "dl", "dd" };
-    XpmColorSymbol symbols[4];
-
-    /* The XSynchronize calls were copied from CreatePieces.
-       Not sure if needed, but can't hurt */
-    XSynchronize(xDisplay, True); /* Work-around for xlib/xt buffering bug */
-
-    /* Setup translations so piece colors match square colors */
-    symbols[0].name = "light_piece";
-    symbols[0].value = appData.whitePieceColor;
-    symbols[1].name = "dark_piece";
-    symbols[1].value = appData.blackPieceColor;
-    symbols[2].name = "light_square";
-    symbols[2].value = appData.lightSquareColor;
-    symbols[3].name = "dark_square";
-    symbols[3].value = appData.darkSquareColor;
-
-    attr.valuemask = XpmColorSymbols;
-    attr.colorsymbols = symbols;
-    attr.numsymbols = 4;
-
-    if (appData.monoMode) {
-      DisplayFatalError(_("XPM pieces cannot be used in monochrome mode"),
-                       0, 2);
-      ExitEvent(2);
-    }
-    if (strlen(appData.pixmapDirectory) == 0) {
-       XpmPieces* pieces = builtInXpms;
-       useImages = 1;
-       /* Load pieces */
-       while (pieces->size != squareSize && pieces->size) pieces++;
-       if (!pieces->size) {
-         fprintf(stderr, _("No builtin XPM pieces of size %d\n"), squareSize);
-         exit(1);
-       }
-       for (piece = (int) WhitePawn; piece <= (int) WhiteKing + 4; piece++) {
-           for (kind=0; kind<4; kind++) {
-
-               if ((r=XpmCreatePixmapFromData(xDisplay, xBoardWindow,
-                                              pieces->xpm[piece][kind],
-                                              &(xpmPieceBitmap2[kind][piece]),
-                                              NULL, &attr)) != 0) {
-                 fprintf(stderr, _("Error %d loading XPM image \"%s\"\n"),
-                         r, buf);
-                 exit(1);
-               }
-               if(piece <= (int) WhiteKing)
-                   xpmPieceBitmap[kind][piece] = xpmPieceBitmap2[kind][piece];
-           }
-       }
-       useImageSqs = 0;
-       xpmJailSquare = xpmLightSquare;
-    } else {
-       useImages = 1;
-
-       fprintf(stderr, _("\nLoading XPMs...\n"));
-
-       /* Load pieces */
-       for (piece = (int) WhitePawn; piece <= (int) WhiteKing + 4; piece++) {
-           fprintf(stderr, "%d ", piece+1);
-           for (kind=0; kind<4; kind++) {
-             snprintf(buf, sizeof(buf), "%s/%s%c%s%u.xpm",
-                       ExpandPathName(appData.pixmapDirectory),
-                       piece > (int) WhiteKing ? "w" : "",
-                       pieceBitmapNames[piece],
-                       xpmkind[kind], ss);
-               if (appData.debugMode) {
-                   fprintf(stderr, _("(File:%s:) "), buf);
-               }
-               if ((r=XpmReadFileToPixmap(xDisplay, xBoardWindow, buf,
-                                          &(xpmPieceBitmap2[kind][piece]),
-                                          NULL, &attr)) != 0) {
-                   if(piece != (int)WhiteKing && piece > (int)WhiteQueen) {
-                     // [HGM] missing: read of unorthodox piece failed; substitute King.
-                     snprintf(buf, sizeof(buf), "%s/k%s%u.xpm",
-                               ExpandPathName(appData.pixmapDirectory),
-                               xpmkind[kind], ss);
-                       if (appData.debugMode) {
-                           fprintf(stderr, _("(Replace by File:%s:) "), buf);
-                       }
-                       r=XpmReadFileToPixmap(xDisplay, xBoardWindow, buf,
-                                               &(xpmPieceBitmap2[kind][piece]),
-                                               NULL, &attr);
-                   }
-                   if (r != 0) {
-                       fprintf(stderr, _("Error %d loading XPM file \"%s\"\n"),
-                               r, buf);
-                       exit(1);
-                   }
-               }
-               if(piece <= (int) WhiteKing) 
-                   xpmPieceBitmap[kind][piece] = xpmPieceBitmap2[kind][piece];
-           }
-       }
-       /* Load light and dark squares */
-       /* If the LSQ and DSQ pieces don't exist, we will
-          draw them with solid squares. */
-       fprintf(stderr, _("light square "));
-       snprintf(buf, sizeof(buf), "%s/lsq%u.xpm", ExpandPathName(appData.pixmapDirectory), ss);
-       if (access(buf, 0) != 0) {
-           useImageSqs = 0;
-       } else {
-           useImageSqs = 1;
-           if (appData.debugMode)
-             fprintf(stderr, _("(File:%s:) "), buf);
-
-           if ((r=XpmReadFileToPixmap(xDisplay, xBoardWindow, buf,
-                                      &xpmLightSquare, NULL, &attr)) != 0) {
-               fprintf(stderr, _("Error %d loading XPM file \"%s\"\n"), r, buf);
-               exit(1);
-           }
-           fprintf(stderr, _("dark square "));
-           snprintf(buf, sizeof(buf), "%s/dsq%u.xpm",
-                   ExpandPathName(appData.pixmapDirectory), ss);
-           if (appData.debugMode) {
-               fprintf(stderr, _("(File:%s:) "), buf);
-           }
-           if ((r=XpmReadFileToPixmap(xDisplay, xBoardWindow, buf,
-                                      &xpmDarkSquare, NULL, &attr)) != 0) {
-               fprintf(stderr, _("Error %d loading XPM file \"%s\"\n"), r, buf);
-               exit(1);
-           }
-       }
-       xpmJailSquare = xpmLightSquare;
-       fprintf(stderr, _("Done.\n"));
-    }
-    XSynchronize(xDisplay, False); /* Work-around for xlib/xt
-                                     buffering bug */
-}
-#endif /* HAVE_LIBXPM */
-
-#if HAVE_LIBXPM
-/* No built-in bitmaps */
-void CreatePieces()
-{
-    int piece, kind;
-    char buf[MSG_SIZ];
-    u_int ss = squareSize;
-
-    XSynchronize(xDisplay, True); /* Work-around for xlib/xt
-                                    buffering bug */
-
-    for (kind = SOLID; kind <= (appData.monoMode ? OUTLINE : SOLID); kind++) {
-       for (piece = (int) WhitePawn; piece <= (int) WhiteKing + 4; piece++) {
-           sprintf(buf, "%s%c%u%c.bm", piece > (int)WhiteKing ? "w" : "",
-                   pieceBitmapNames[piece],
-                   ss, kind == SOLID ? 's' : 'o');
-           ReadBitmap(&pieceBitmap2[kind][piece], buf, NULL, ss, ss);
-           if(piece <= (int)WhiteKing)
-               pieceBitmap[kind][piece] = pieceBitmap2[kind][piece];
-       }
-    }
-
-    XSynchronize(xDisplay, False); /* Work-around for xlib/xt
-                                     buffering bug */
-}
-#else
-/* With built-in bitmaps */
 void CreatePieces()
 {
-    BuiltInBits* bib = builtInBits;
-    int piece, kind;
-    char buf[MSG_SIZ];
-    u_int ss = squareSize;
-
-    XSynchronize(xDisplay, True); /* Work-around for xlib/xt
-                                    buffering bug */
-
-    while (bib->squareSize != ss && bib->squareSize != 0) bib++;
-
-    for (kind = SOLID; kind <= (appData.monoMode ? OUTLINE : SOLID); kind++) {
-       for (piece = (int) WhitePawn; piece <= (int) WhiteKing + 4; piece++) {
-           sprintf(buf, "%s%c%u%c.bm", piece > (int)WhiteKing ? "w" : "",
-                   pieceBitmapNames[piece],
-                   ss, kind == SOLID ? 's' : 'o');
-           ReadBitmap(&pieceBitmap2[kind][piece], buf,
-                      bib->bits[kind][piece], ss, ss);
-           if(piece <= (int)WhiteKing)
-               pieceBitmap[kind][piece] = pieceBitmap2[kind][piece];
-       }
-    }
+  int i;
 
-    XSynchronize(xDisplay, False); /* Work-around for xlib/xt
-                                     buffering bug */
-}
-#endif
-
-void ReadBitmap(pm, name, bits, wreq, hreq)
-     Pixmap *pm;
-     String name;
-     unsigned char bits[];
-     u_int wreq, hreq;
-{
-    int x_hot, y_hot;
-    u_int w, h;
-    int errcode;
-    char msg[MSG_SIZ], fullname[MSG_SIZ];
-
-    if (*appData.bitmapDirectory != NULLCHAR) {
-        strcpy(fullname, appData.bitmapDirectory);
-       strcat(fullname, "/");
-       strcat(fullname, name);
-       errcode = XReadBitmapFile(xDisplay, xBoardWindow, fullname,
-                                 &w, &h, pm, &x_hot, &y_hot);
-    fprintf(stderr, "load %s\n", name);
-       if (errcode != BitmapSuccess) {
-           switch (errcode) {
-             case BitmapOpenFailed:
-               snprintf(msg, sizeof(msg), _("Can't open bitmap file %s"), fullname);
-               break;
-             case BitmapFileInvalid:
-               snprintf(msg, sizeof(msg), _("Invalid bitmap in file %s"), fullname);
-               break;
-             case BitmapNoMemory:
-               snprintf(msg, sizeof(msg), _("Ran out of memory reading bitmap file %s"),
-                       fullname);
-               break;
-             default:
-               snprintf(msg, sizeof(msg), _("Unknown XReadBitmapFile error %d on file %s"),
-                       errcode, fullname);
-               break;
-           }
-           fprintf(stderr, _("%s: %s...using built-in\n"),
-                   programName, msg);
-       } else if (w != wreq || h != hreq) {
-           fprintf(stderr,
-                   _("%s: Bitmap %s is %dx%d, not %dx%d...using built-in\n"),
-                   programName, fullname, w, h, wreq, hreq);
-       } else {
-           return;
+  /* free if used 
+  for(i=0;i<MAXPIECES;i++)
+    {
+      if(SVGpieces[i])
+       {       
+         g_free(SVGpieces[i]);
+         SVGpieces[i]=NULL;
        }
     }
-    if (bits != NULL) {
-       *pm = XCreateBitmapFromData(xDisplay, xBoardWindow, (char *) bits,
-                                   wreq, hreq);
-    }
-}
+  */
 
-void CreateGrid()
-{
-    int i, j;
+  /* reload these */
+  SVGLightSquare   = load_pixbuf("svg/LightSquare.svg",squareSize);
+  SVGDarkSquare    = load_pixbuf("svg/DarkSquare.svg",squareSize);
+  SVGNeutralSquare = load_pixbuf("svg/NeutralSquare.svg",squareSize);
 
-    if (lineGap == 0) return;
 
-    /* [HR] Split this into 2 loops for non-square boards. */
+  /* get some defaults going */
+  for(i=WhitePawn; i<DemotePiece+1; i++)
+    SVGpieces[i]   = load_pixbuf("svg/NeutralSquare.svg",squareSize);
+    
+  SVGpieces[WhitePawn]   = load_pixbuf("svg/WhitePawn.svg",squareSize);
+  SVGpieces[WhiteKnight] = load_pixbuf("svg/WhiteKnight.svg",squareSize);
+  SVGpieces[WhiteBishop] = load_pixbuf("svg/WhiteBishop.svg",squareSize);
+  SVGpieces[WhiteRook]   = load_pixbuf("svg/WhiteRook.svg",squareSize);
+  SVGpieces[WhiteQueen]  = load_pixbuf("svg/WhiteQueen.svg",squareSize);
+  SVGpieces[WhiteKing]   = load_pixbuf("svg/WhiteKing.svg",squareSize);
 
-    for (i = 0; i < BOARD_HEIGHT + 1; i++) {
-        gridSegments[i].x1 = 0;
-        gridSegments[i].x2 =
-          lineGap + BOARD_WIDTH * (squareSize + lineGap);
-        gridSegments[i].y1 = gridSegments[i].y2
-          = lineGap / 2 + (i * (squareSize + lineGap));
-    }
+  SVGpieces[BlackPawn]   = load_pixbuf("svg/BlackPawn.svg",squareSize);
+  SVGpieces[BlackKnight] = load_pixbuf("svg/BlackKnight.svg",squareSize);
+  SVGpieces[BlackBishop] = load_pixbuf("svg/BlackBishop.svg",squareSize);
+  SVGpieces[BlackRook]   = load_pixbuf("svg/BlackRook.svg",squareSize);
+  SVGpieces[BlackQueen]  = load_pixbuf("svg/BlackQueen.svg",squareSize);
+  SVGpieces[BlackKing]   = load_pixbuf("svg/BlackKing.svg",squareSize);
 
-    for (j = 0; j < BOARD_WIDTH + 1; j++) {
-        gridSegments[j + i].y1 = 0;
-        gridSegments[j + i].y2 =
-          lineGap + BOARD_HEIGHT * (squareSize + lineGap);
-        gridSegments[j + i].x1 = gridSegments[j + i].x2
-          = lineGap / 2 + (j * (squareSize + lineGap));
-    }
+  return;
 }
 
+
 static void MenuBarSelect(w, addr, index)
      Widget w;
      caddr_t addr;
@@ -4260,39 +3180,6 @@ Widget CreateMenuBar(mb)
     return menuBar;
 }
 
-Widget CreateButtonBar(mi)
-     MenuItem *mi;
-{
-    int j;
-    Widget button, buttonBar;
-    Arg args[16];
-
-    j = 0;
-    XtSetArg(args[j], XtNorientation, XtorientHorizontal); j++;
-    if (tinyLayout) {
-       XtSetArg(args[j], XtNhSpace, 0); j++;
-    }
-    XtSetArg(args[j], XtNborderWidth, 0); j++;
-    XtSetArg(args[j], XtNvSpace, 0);                        j++;
-    buttonBar = XtCreateWidget("buttonBar", boxWidgetClass,
-                              formWidget, args, j);
-
-    while (mi->string != NULL) {
-       j = 0;
-       if (tinyLayout) {
-           XtSetArg(args[j], XtNinternalWidth, 2); j++;
-           XtSetArg(args[j], XtNborderWidth, 0); j++;
-       }
-      XtSetArg(args[j], XtNlabel, XtNewString(_(mi->string))); j++;
-       button = XtCreateManagedWidget(mi->string, commandWidgetClass,
-                                      buttonBar, args, j);
-       XtAddCallback(button, XtNcallback,
-                     (XtCallbackProc) MenuBarSelect,
-                     (caddr_t) mi->proc);
-       mi++;
-    }
-    return buttonBar;
-}
 
 Widget
 CreatePieceMenu(name, color)
@@ -4338,32 +3225,32 @@ CreatePieceMenus()
     Arg args[16];
     ChessSquare selection;
 
-    whitePieceMenu = CreatePieceMenu("menuW", 0);
-    blackPieceMenu = CreatePieceMenu("menuB", 1);
-
-    XtRegisterGrabAction(PieceMenuPopup, True,
-                        (unsigned)(ButtonPressMask|ButtonReleaseMask),
-                        GrabModeAsync, GrabModeAsync);
-
-    XtSetArg(args[0], XtNlabel, _("Drop"));
-    dropMenu = XtCreatePopupShell("menuD", simpleMenuWidgetClass,
-                                 boardWidget, args, 1);
-    for (i = 0; i < DROP_MENU_SIZE; i++) {
-       String item = dropMenuStrings[i];
-
-       if (strcmp(item, "----") == 0) {
-           entry = XtCreateManagedWidget(item, smeLineObjectClass,
-                                         dropMenu, NULL, 0);
-       } else {
-          XtSetArg(args[0], XtNlabel, XtNewString(_(item)));
-           entry = XtCreateManagedWidget(item, smeBSBObjectClass,
-                                dropMenu, args, 1);
-           selection = dropMenuTranslation[i];
-           XtAddCallback(entry, XtNcallback,
-                         (XtCallbackProc) DropMenuSelect,
-                         (caddr_t) selection);
-       }
-    }
+//    whitePieceMenu = CreatePieceMenu("menuW", 0);
+//    blackPieceMenu = CreatePieceMenu("menuB", 1);
+//
+//    XtRegisterGrabAction(PieceMenuPopup, True,
+//                      (unsigned)(ButtonPressMask|ButtonReleaseMask),
+//                      GrabModeAsync, GrabModeAsync);
+//
+//    XtSetArg(args[0], XtNlabel, _("Drop"));
+//    dropMenu = XtCreatePopupShell("menuD", simpleMenuWidgetClass,
+//                               boardWidget, args, 1);
+//    for (i = 0; i < DROP_MENU_SIZE; i++) {
+//     String item = dropMenuStrings[i];
+//
+//     if (strcmp(item, "----") == 0) {
+//         entry = XtCreateManagedWidget(item, smeLineObjectClass,
+//                                       dropMenu, NULL, 0);
+//     } else {
+//          XtSetArg(args[0], XtNlabel, XtNewString(_(item)));
+//         entry = XtCreateManagedWidget(item, smeBSBObjectClass,
+//                                dropMenu, args, 1);
+//         selection = dropMenuTranslation[i];
+//         XtAddCallback(entry, XtNcallback,
+//                       (XtCallbackProc) DropMenuSelect,
+//                       (caddr_t) selection);
+//     }
+//    }
 }
 
 void SetupDropMenu()
@@ -4450,33 +3337,6 @@ static void DropMenuSelect(w, piece, junk)
     DropMenuEvent(piece, pmFromX, pmFromY);
 }
 
-void WhiteClock(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    if (gameMode == EditPosition || gameMode == IcsExamining) {
-       SetWhiteToPlayEvent();
-    } else if (gameMode == IcsPlayingBlack || gameMode == MachinePlaysWhite) {
-       CallFlagEvent();
-    }
-}
-
-void BlackClock(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    if (gameMode == EditPosition || gameMode == IcsExamining) {
-       SetBlackToPlayEvent();
-    } else if (gameMode == IcsPlayingWhite || gameMode == MachinePlaysBlack) {
-       CallFlagEvent();
-    }
-}
-
-
 /*
  * If the user selects on a border boundary, return -1; if off the board,
  *   return -2.  Otherwise map the event coordinate to the square.
@@ -4503,26 +3363,58 @@ static void do_flash_delay(msec)
     TimeDelay(msec);
 }
 
-static void drawHighlight(file, rank, gc)
-     int file, rank;
-     GC gc;
+static void drawHighlight(file, rank, line_type)
+     int file, rank, line_type;
 {
     int x, y;
+    cairo_t *cr;
 
     if (lineGap == 0 || appData.blindfold) return;
 
-    if (flipView) {
+    if (flipView)
+      {
        x = lineGap/2 + ((BOARD_WIDTH-1)-file) *
          (squareSize + lineGap);
        y = lineGap/2 + rank * (squareSize + lineGap);
-    } else {
+      }
+    else
+      {
        x = lineGap/2 + file * (squareSize + lineGap);
        y = lineGap/2 + ((BOARD_HEIGHT-1)-rank) *
          (squareSize + lineGap);
-    }
+      }
+
+    /* get a cairo_t */
+    cr = gdk_cairo_create (GDK_WINDOW(GUI_Board->window));
 
-    XDrawRectangle(xDisplay, xBoardWindow, gc, x, y,
-                  squareSize+lineGap, squareSize+lineGap);
+    /* draw the highlight */
+    cairo_move_to (cr, x, y);
+    cairo_rel_line_to (cr, 0,squareSize+lineGap);
+    cairo_rel_line_to (cr, squareSize+lineGap,0);
+    cairo_rel_line_to (cr, 0,-squareSize-lineGap);
+    cairo_close_path (cr);
+
+    cairo_set_line_width (cr, lineGap);
+    switch(line_type)
+      {
+       /* TODO: use appdata colors */
+      case LINE_TYPE_HIGHLIGHT:
+       cairo_set_source_rgba (cr, 1, 1, 0, 1.0);
+       break;
+      case LINE_TYPE_PRE:
+       cairo_set_source_rgba (cr, 1, 0, 0, 1.0);
+       break;
+      case LINE_TYPE_NORMAL:
+      default:
+       cairo_set_source_rgba (cr, 0, 1, 0, 1.0);
+      }
+
+    cairo_stroke (cr);
+
+    /* free memory */
+    cairo_destroy (cr);
+
+    return;
 }
 
 int hi1X = -1, hi1Y = -1, hi2X = -1, hi2Y = -1;
@@ -4532,26 +3424,34 @@ void
 SetHighlights(fromX, fromY, toX, toY)
      int fromX, fromY, toX, toY;
 {
-    if (hi1X != fromX || hi1Y != fromY) {
-       if (hi1X >= 0 && hi1Y >= 0) {
-           drawHighlight(hi1X, hi1Y, lineGC);
-       }
-       if (fromX >= 0 && fromY >= 0) {
-           drawHighlight(fromX, fromY, highlineGC);
-       }
-    }
-    if (hi2X != toX || hi2Y != toY) {
-       if (hi2X >= 0 && hi2Y >= 0) {
-           drawHighlight(hi2X, hi2Y, lineGC);
-       }
-       if (toX >= 0 && toY >= 0) {
-           drawHighlight(toX, toY, highlineGC);
-       }
-    }
+    if (hi1X != fromX || hi1Y != fromY)
+      {
+       if (hi1X >= 0 && hi1Y >= 0)
+         {
+           drawHighlight(hi1X, hi1Y, LINE_TYPE_NORMAL);
+         }
+       if (fromX >= 0 && fromY >= 0)
+         {
+           drawHighlight(fromX, fromY, LINE_TYPE_HIGHLIGHT);
+         }
+      }
+    if (hi2X != toX || hi2Y != toY)
+      {
+       if (hi2X >= 0 && hi2Y >= 0)
+         {
+           drawHighlight(hi2X, hi2Y, LINE_TYPE_NORMAL);
+         }
+       if (toX >= 0 && toY >= 0)
+         {
+           drawHighlight(toX, toY, LINE_TYPE_HIGHLIGHT);
+         }
+      }
     hi1X = fromX;
     hi1Y = fromY;
     hi2X = toX;
     hi2Y = toY;
+
+    return;
 }
 
 void
@@ -4565,26 +3465,35 @@ void
 SetPremoveHighlights(fromX, fromY, toX, toY)
      int fromX, fromY, toX, toY;
 {
-    if (pm1X != fromX || pm1Y != fromY) {
-       if (pm1X >= 0 && pm1Y >= 0) {
-           drawHighlight(pm1X, pm1Y, lineGC);
-       }
-       if (fromX >= 0 && fromY >= 0) {
-           drawHighlight(fromX, fromY, prelineGC);
-       }
-    }
-    if (pm2X != toX || pm2Y != toY) {
-       if (pm2X >= 0 && pm2Y >= 0) {
-           drawHighlight(pm2X, pm2Y, lineGC);
-       }
-       if (toX >= 0 && toY >= 0) {
-           drawHighlight(toX, toY, prelineGC);
-       }
-    }
+    if (pm1X != fromX || pm1Y != fromY)
+      {
+       if (pm1X >= 0 && pm1Y >= 0)
+         {
+           drawHighlight(pm1X, pm1Y, LINE_TYPE_NORMAL);
+         }
+       if (fromX >= 0 && fromY >= 0)
+         {
+           drawHighlight(fromX, fromY, LINE_TYPE_PRE);
+         }
+      }
+    if (pm2X != toX || pm2Y != toY)
+      {
+       if (pm2X >= 0 && pm2Y >= 0)
+         {
+           drawHighlight(pm2X, pm2Y, LINE_TYPE_NORMAL);
+         }
+       if (toX >= 0 && toY >= 0)
+         {
+           drawHighlight(toX, toY, LINE_TYPE_PRE);
+         }
+      }
+
     pm1X = fromX;
     pm1Y = fromY;
     pm2X = toX;
     pm2Y = toY;
+
+    return;
 }
 
 void
@@ -4598,172 +3507,38 @@ static void BlankSquare(x, y, color, piece, dest)
      ChessSquare piece;
      Drawable dest;
 {
-    if (useImages && useImageSqs) {
-       Pixmap pm;
-       switch (color) {
-         case 1: /* light */
-           pm = xpmLightSquare;
-           break;
-         case 0: /* dark */
-           pm = xpmDarkSquare;
-           break;
-         case 2: /* neutral */
-         default:
-           pm = xpmJailSquare;
-           break;
-       }
-       XCopyArea(xDisplay, pm, dest, wlPieceGC, 0, 0,
-                 squareSize, squareSize, x, y);
-    } else {
-       GC gc;
-       switch (color) {
-         case 1: /* light */
-           gc = lightSquareGC;
-           break;
-         case 0: /* dark */
-           gc = darkSquareGC;
-           break;
-         case 2: /* neutral */
-         default:
-           gc = jailSquareGC;
-           break;
-       }
-       XFillRectangle(xDisplay, dest, gc, x, y, squareSize, squareSize);
-    }
-}
-
-/*
-   I split out the routines to draw a piece so that I could
-   make a generic flash routine.
-*/
-static void monoDrawPiece_1bit(piece, square_color, x, y, dest)
-     ChessSquare piece;
-     int square_color, x, y;
-     Drawable dest;
-{
-    /* Avoid XCopyPlane on 1-bit screens to work around Sun bug */
-    switch (square_color) {
-      case 1: /* light */
-      case 2: /* neutral */
-      default:
-       XCopyArea(xDisplay, (int) piece < (int) BlackPawn
-                 ? *pieceToOutline(piece)
-                 : *pieceToSolid(piece),
-                 dest, bwPieceGC, 0, 0,
-                 squareSize, squareSize, x, y);
-       break;
-      case 0: /* dark */
-       XCopyArea(xDisplay, (int) piece < (int) BlackPawn
-                 ? *pieceToSolid(piece)
-                 : *pieceToOutline(piece),
-                 dest, wbPieceGC, 0, 0,
-                 squareSize, squareSize, x, y);
-       break;
-    }
-}
-
-static void monoDrawPiece(piece, square_color, x, y, dest)
-     ChessSquare piece;
-     int square_color, x, y;
-     Drawable dest;
-{
-    switch (square_color) {
-      case 1: /* light */
-      case 2: /* neutral */
-      default:
-       XCopyPlane(xDisplay, (int) piece < (int) BlackPawn
-                  ? *pieceToOutline(piece)
-                  : *pieceToSolid(piece),
-                  dest, bwPieceGC, 0, 0,
-                  squareSize, squareSize, x, y, 1);
-       break;
-      case 0: /* dark */
-       XCopyPlane(xDisplay, (int) piece < (int) BlackPawn
-                  ? *pieceToSolid(piece)
-                  : *pieceToOutline(piece),
-                  dest, wbPieceGC, 0, 0,
-                  squareSize, squareSize, x, y, 1);
-       break;
-    }
-}
+      GdkPixbuf *pb;
 
-static void colorDrawPiece(piece, square_color, x, y, dest)
-     ChessSquare piece;
-     int square_color, x, y;
-     Drawable dest;
-{
-    if(pieceToSolid(piece) == NULL) return; // [HGM] bitmaps: make it non-fatal if we have no bitmap;
-    switch (square_color) {
-      case 1: /* light */
-       XCopyPlane(xDisplay, *pieceToSolid(piece),
-                  dest, (int) piece < (int) BlackPawn
-                  ? wlPieceGC : blPieceGC, 0, 0,
-                  squareSize, squareSize, x, y, 1);
-       break;
-      case 0: /* dark */
-       XCopyPlane(xDisplay, *pieceToSolid(piece),
-                  dest, (int) piece < (int) BlackPawn
-                  ? wdPieceGC : bdPieceGC, 0, 0,
-                  squareSize, squareSize, x, y, 1);
-       break;
-      case 2: /* neutral */
-      default:
-       XCopyPlane(xDisplay, *pieceToSolid(piece),
-                  dest, (int) piece < (int) BlackPawn
-                  ? wjPieceGC : bjPieceGC, 0, 0,
-                  squareSize, squareSize, x, y, 1);
-       break;
-    }
+      switch (color) 
+       {
+       case 0: /* dark */
+         pb = SVGDarkSquare;
+         break;
+       case 1: /* light */
+         pb = SVGLightSquare;
+         break;
+       case 2: /* neutral */
+       default:
+         pb = SVGNeutralSquare;
+         break;
+       }
+      gdk_draw_pixbuf(GDK_WINDOW(GUI_Board->window),NULL,pb,0,0,x,y,-1,-1, GDK_RGB_DITHER_NORMAL, 0, 0);
+      return;
 }
 
-static void colorDrawPieceImage(piece, square_color, x, y, dest)
+static void DrawPiece(piece, square_color, x, y, dest)
      ChessSquare piece;
      int square_color, x, y;
      Drawable dest;
 {
-    int kind;
+  /* redraw background, since piece might be transparent in some areas */
+  BlankSquare(x,y,square_color,piece,dest);
 
-    switch (square_color) {
-      case 1: /* light */
-      case 2: /* neutral */
-      default:
-       if ((int)piece < (int) BlackPawn) {
-           kind = 0;
-       } else {
-           kind = 2;
-           piece -= BlackPawn;
-       }
-       break;
-      case 0: /* dark */
-       if ((int)piece < (int) BlackPawn) {
-           kind = 1;
-       } else {
-           kind = 3;
-           piece -= BlackPawn;
-       }
-       break;
-    }
-    XCopyArea(xDisplay, xpmPieceBitmap[kind][piece],
-             dest, wlPieceGC, 0, 0,
-             squareSize, squareSize, x, y);
-}
-
-typedef void (*DrawFunc)();
-
-DrawFunc ChooseDrawFunc()
-{
-    if (appData.monoMode) {
-       if (DefaultDepth(xDisplay, xScreen) == 1) {
-           return monoDrawPiece_1bit;
-       } else {
-           return monoDrawPiece;
-       }
-    } else {
-       if (useImages)
-         return colorDrawPieceImage;
-       else
-         return colorDrawPiece;
-    }
+  /* draw piece */
+  gdk_draw_pixbuf(GDK_WINDOW(GUI_Board->window),NULL,
+                 GDK_PIXBUF(SVGpieces[piece]),0,0,x,y,-1,-1,
+                 GDK_RGB_DITHER_NORMAL, 0, 0);
+  return ;
 }
 
 /* [HR] determine square color depending on chess variant. */
@@ -4796,141 +3571,182 @@ void DrawSquare(row, column, piece, do_flash)
      int row, column, do_flash;
      ChessSquare piece;
 {
-    int square_color, x, y, direction, font_ascent, font_descent;
+    int square_color, x, y;
     int i;
     char string[2];
-    XCharStruct overall;
-    DrawFunc drawfunc;
     int flash_delay;
 
     /* Calculate delay in milliseconds (2-delays per complete flash) */
     flash_delay = 500 / appData.flashRate;
 
-    if (flipView) {
+    /* calculate x and y coordinates from row and column */
+    if (flipView)
+      {
        x = lineGap + ((BOARD_WIDTH-1)-column) *
          (squareSize + lineGap);
        y = lineGap + row * (squareSize + lineGap);
-    } else {
+      }
+    else
+      {
        x = lineGap + column * (squareSize + lineGap);
        y = lineGap + ((BOARD_HEIGHT-1)-row) *
          (squareSize + lineGap);
-    }
+      }
 
     square_color = SquareColor(row, column);
 
-    if ( // [HGM] holdings: blank out area between board and holdings
-                 column == BOARD_LEFT-1 ||  column == BOARD_RGHT
-              || (column == BOARD_LEFT-2 && row < BOARD_HEIGHT-gameInfo.holdingsSize)
-                 || (column == BOARD_RGHT+1 && row >= gameInfo.holdingsSize) ) {
-                       BlankSquare(x, y, 2, EmptySquare, xBoardWindow);
-
-                       // [HGM] print piece counts next to holdings
-                       string[1] = NULLCHAR;
-                       if (column == (flipView ? BOARD_LEFT-1 : BOARD_RGHT) && piece > 1 ) {
-                           string[0] = '0' + piece;
-                           XTextExtents(countFontStruct, string, 1, &direction,
-                                &font_ascent, &font_descent, &overall);
-                           if (appData.monoMode) {
-                               XDrawImageString(xDisplay, xBoardWindow, countGC,
-                                                x + squareSize - overall.width - 2,
-                                                y + font_ascent + 1, string, 1);
-                           } else {
-                               XDrawString(xDisplay, xBoardWindow, countGC,
-                                           x + squareSize - overall.width - 2,
-                                           y + font_ascent + 1, string, 1);
-                           }
-                       }
-                       if (column == (flipView ? BOARD_RGHT : BOARD_LEFT-1) && piece > 1) {
-                           string[0] = '0' + piece;
-                           XTextExtents(countFontStruct, string, 1, &direction,
-                                        &font_ascent, &font_descent, &overall);
-                           if (appData.monoMode) {
-                               XDrawImageString(xDisplay, xBoardWindow, countGC,
-                                                x + 2, y + font_ascent + 1, string, 1);
-                           } else {
-                               XDrawString(xDisplay, xBoardWindow, countGC,
-                                           x + 2, y + font_ascent + 1, string, 1);
-                           }
-                       }
-    } else {
-           if (piece == EmptySquare || appData.blindfold) {
-                       BlankSquare(x, y, square_color, piece, xBoardWindow);
-           } else {
-                       drawfunc = ChooseDrawFunc();
-                       if (do_flash && appData.flashCount > 0) {
-                           for (i=0; i<appData.flashCount; ++i) {
-
-                                       drawfunc(piece, square_color, x, y, xBoardWindow);
-                                       XSync(xDisplay, False);
-                                       do_flash_delay(flash_delay);
-
-                                       BlankSquare(x, y, square_color, piece, xBoardWindow);
-                                       XSync(xDisplay, False);
-                                       do_flash_delay(flash_delay);
-                           }
-                       }
-                       drawfunc(piece, square_color, x, y, xBoardWindow);
-       }
-       }
+    // [HGM] holdings: blank out area between board and holdings
+    if ( column == BOARD_LEFT-1 ||  column == BOARD_RGHT
+        || (column == BOARD_LEFT-2 && row < BOARD_HEIGHT-gameInfo.holdingsSize)
+        || (column == BOARD_RGHT+1 && row >= gameInfo.holdingsSize) )
+      {
+       BlankSquare(x, y, 2, EmptySquare, xBoardWindow);
 
-    string[1] = NULLCHAR;
-    if (appData.showCoords && row == (flipView ? BOARD_HEIGHT-1 : 0)
-               && column >= BOARD_LEFT && column < BOARD_RGHT) {
-       string[0] = 'a' + column - BOARD_LEFT;
-       XTextExtents(coordFontStruct, string, 1, &direction,
-                    &font_ascent, &font_descent, &overall);
-       if (appData.monoMode) {
-           XDrawImageString(xDisplay, xBoardWindow, coordGC,
-                            x + squareSize - overall.width - 2,
-                            y + squareSize - font_descent - 1, string, 1);
-       } else {
-           XDrawString(xDisplay, xBoardWindow, coordGC,
-                       x + squareSize - overall.width - 2,
-                       y + squareSize - font_descent - 1, string, 1);
-       }
-    }
-    if (appData.showCoords && column == (flipView ? BOARD_RGHT-1 : BOARD_LEFT)) {
-       string[0] = ONE + row;
-       XTextExtents(coordFontStruct, string, 1, &direction,
-                    &font_ascent, &font_descent, &overall);
-       if (appData.monoMode) {
-           XDrawImageString(xDisplay, xBoardWindow, coordGC,
-                            x + 2, y + font_ascent + 1, string, 1);
-       } else {
-           XDrawString(xDisplay, xBoardWindow, coordGC,
-                       x + 2, y + font_ascent + 1, string, 1);
-       }
-    }
-}
+       // [HGM] print piece counts next to holdings
+       string[1] = NULLCHAR;
+       if(piece > 1)
+         {
+           cairo_text_extents_t extents;
+           cairo_t *cr;
+           int  xpos, ypos;
 
+           /* get a cairo_t */
+           cr = gdk_cairo_create (GDK_WINDOW(GUI_Board->window));
 
-/* Why is this needed on some versions of X? */
-void EventProc(widget, unused, event)
-     Widget widget;
-     caddr_t unused;
-     XEvent *event;
-{
-    if (!XtIsRealized(widget))
-      return;
+           string[0] = '0' + piece;
 
-    switch (event->type) {
-      case Expose:
-       if (event->xexpose.count > 0) return;  /* no clipping is done */
-       XDrawPosition(widget, True, NULL);
-       break;
-      default:
-       return;
-    }
-}
-/* end why */
+           /* TODO this has to go into the font-selection */
+           cairo_select_font_face (cr, "Sans",
+                                   CAIRO_FONT_SLANT_NORMAL,
+                                   CAIRO_FONT_WEIGHT_NORMAL);
 
-void DrawPosition(fullRedraw, board)
-     /*Boolean*/int fullRedraw;
-     Board board;
-{
-    XDrawPosition(boardWidget, fullRedraw, board);
+           cairo_set_font_size (cr, 12.0);
+           cairo_text_extents (cr, string, &extents);
+
+           if (column == (flipView ? BOARD_LEFT-1 : BOARD_RGHT) )
+             {
+               xpos= x + squareSize - extents.width - 2;
+               ypos= y + extents.y_bearing + 1;
+             }
+           if (column == (flipView ? BOARD_RGHT : BOARD_LEFT-1) && piece > 1)
+             {
+               xpos= x + 2;
+               ypos = y + extents.y_bearing + 1;
+             }
+
+           /* TODO mono mode? */
+           cairo_move_to (cr, xpos, ypos);
+           cairo_text_path (cr, string);
+           cairo_set_source_rgb (cr, 1.0, 1.0, 1);
+           cairo_fill_preserve (cr);
+           cairo_set_source_rgb (cr, 0, 0, 0);
+           cairo_set_line_width (cr, 0.1);
+           cairo_stroke (cr);
+
+           /* free memory */
+           cairo_destroy (cr);
+         }
+      }
+    else
+      {
+       /* square on the board */
+       if (piece == EmptySquare || appData.blindfold)
+         {
+           BlankSquare(x, y, square_color, piece, xBoardWindow);
+         }
+       else
+         {
+           if (do_flash && appData.flashCount > 0)
+             {
+               for (i=0; i<appData.flashCount; ++i)
+                 {
+
+                   DrawPiece(piece, square_color, x, y, xBoardWindow);
+                   do_flash_delay(flash_delay);
+
+                   BlankSquare(x, y, square_color, piece, xBoardWindow);
+                   do_flash_delay(flash_delay);
+                 }
+             }
+           DrawPiece(piece, square_color, x, y, xBoardWindow);
+         }
+      }
+
+    /* show coordinates if necessary */
+    if(appData.showCoords)
+      {
+       cairo_text_extents_t extents;
+       cairo_t *cr;
+       int  xpos, ypos;
+
+       /* TODO this has to go into the font-selection */
+       cairo_select_font_face (cr, "Sans",
+                               CAIRO_FONT_SLANT_NORMAL,
+                               CAIRO_FONT_WEIGHT_NORMAL);
+       cairo_set_font_size (cr, 12.0);
+
+       string[1] = NULLCHAR;
+
+       /* get a cairo_t */
+       cr = gdk_cairo_create (GDK_WINDOW(GUI_Board->window));
+
+       if (row == (flipView ? BOARD_HEIGHT-1 : 0) &&
+           column >= BOARD_LEFT && column < BOARD_RGHT)
+         {
+           string[0] = 'a' + column - BOARD_LEFT;
+           cairo_text_extents (cr, string, &extents);
+
+           xpos = x + squareSize - extents.width - 2;
+           ypos = y + squareSize - extents.height - extents.y_bearing - 1;
+
+           if (appData.monoMode)
+             { /*TODO*/
+             }
+           else
+             {
+             }
+
+           cairo_move_to (cr, xpos, ypos);
+           cairo_text_path (cr, string);
+           cairo_set_source_rgb (cr, 0.0, 0.0, 0);
+           cairo_fill_preserve (cr);
+           cairo_set_source_rgb (cr, 0, 1.0, 0);
+           cairo_set_line_width (cr, 0.1);
+           cairo_stroke (cr);
+         }
+       if ( column == (flipView ? BOARD_RGHT-1 : BOARD_LEFT))
+         {
+
+           string[0] = ONE + row;
+           cairo_text_extents (cr, string, &extents);
+
+           xpos = x + 2;
+           ypos = y + extents.height + 1;
+
+           if (appData.monoMode)
+             { /*TODO*/
+             }
+           else
+             {
+             }
+
+           cairo_move_to (cr, xpos, ypos);
+           cairo_text_path (cr, string);
+           cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
+           cairo_fill_preserve (cr);
+           cairo_set_source_rgb (cr, 0, 0, 1.0);
+           cairo_set_line_width (cr, 0.1);
+           cairo_stroke (cr);
+
+         }
+       /* free memory */
+       cairo_destroy (cr);
+      }
+
+    return;
 }
 
+
 /* Returns 1 if there are "too many" differences between b1 and b2
    (i.e. more than 1 move was made) */
 static int too_many_diffs(b1, b2)
@@ -5003,116 +3819,150 @@ static int damage[BOARD_SIZE][BOARD_SIZE];
 /*
  * event handler for redrawing the board
  */
-void XDrawPosition(w, repaint, board)
-     Widget w;
+void DrawPosition( repaint, board)
      /*Boolean*/int repaint;
-     Board board;
+               Board board;
 {
-    int i, j, do_flash;
-    static int lastFlipView = 0;
-    static int lastBoardValid = 0;
-    static Board lastBoard;
-    Arg args[16];
-    int rrow, rcol;
-
-    if (board == NULL) {
-       if (!lastBoardValid) return;
-       board = lastBoard;
-    }
-    if (!lastBoardValid || lastFlipView != flipView) {
-       XtSetArg(args[0], XtNleftBitmap, (flipView ? xMarkPixmap : None));
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Flip View"),
-                   args, 1);
-    }
+  int i, j, do_flash;
+  static int lastFlipView = 0;
+  static int lastBoardValid = 0;
+  static Board lastBoard;
+  int rrow, rcol;
 
-    /*
-     * It would be simpler to clear the window with XClearWindow()
-     * but this causes a very distracting flicker.
-     */
+  if (board == NULL) {
+    if (!lastBoardValid) return;
+    board = lastBoard;
+  }
+  if (!lastBoardValid || lastFlipView != flipView) {
+    //    XtSetArg(args[0], XtNleftBitmap, (flipView ? xMarkPixmap : None));
+    // XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Flip View"),
+    // args, 1);
+  }
 
-    if (!repaint && lastBoardValid && lastFlipView == flipView) {
+  /*
+   * It would be simpler to clear the window with XClearWindow()
+   * but this causes a very distracting flicker.
+   */
 
-       /* If too much changes (begin observing new game, etc.), don't
-          do flashing */
-       do_flash = too_many_diffs(board, lastBoard) ? 0 : 1;
+  if (!repaint && lastBoardValid && lastFlipView == flipView)
+    {
+      /* If too much changes (begin observing new game, etc.), don't
+        do flashing */
+      do_flash = too_many_diffs(board, lastBoard) ? 0 : 1;
 
-       /* Special check for castling so we don't flash both the king
-          and the rook (just flash the king). */
-       if (do_flash) {
-           if (check_castle_draw(board, lastBoard, &rrow, &rcol)) {
-               /* Draw rook with NO flashing. King will be drawn flashing later */
-               DrawSquare(rrow, rcol, board[rrow][rcol], 0);
-               lastBoard[rrow][rcol] = board[rrow][rcol];
+      /* Special check for castling so we don't flash both the king
+        and the rook (just flash the king). */
+      if (do_flash)
+       {
+         if (check_castle_draw(board, lastBoard, &rrow, &rcol))
+           {
+             /* Draw rook with NO flashing. King will be drawn flashing later */
+             DrawSquare(rrow, rcol, board[rrow][rcol], 0);
+             lastBoard[rrow][rcol] = board[rrow][rcol];
            }
        }
 
-       /* First pass -- Draw (newly) empty squares and repair damage.
-          This prevents you from having a piece show up twice while it
-          is flashing on its new square */
-       for (i = 0; i < BOARD_HEIGHT; i++)
-         for (j = 0; j < BOARD_WIDTH; j++)
-           if ((board[i][j] != lastBoard[i][j] && board[i][j] == EmptySquare)
-               || damage[i][j]) {
-               DrawSquare(i, j, board[i][j], 0);
-               damage[i][j] = False;
+      /* First pass -- Draw (newly) empty squares and repair damage.
+        This prevents you from having a piece show up twice while it
+        is flashing on its new square */
+      for (i = 0; i < BOARD_HEIGHT; i++)
+       for (j = 0; j < BOARD_WIDTH; j++)
+         if ((board[i][j] != lastBoard[i][j] && board[i][j] == EmptySquare)
+             || damage[i][j])
+           {
+             DrawSquare(i, j, board[i][j], 0);
+             damage[i][j] = False;
            }
 
-       /* Second pass -- Draw piece(s) in new position and flash them */
-       for (i = 0; i < BOARD_HEIGHT; i++)
-         for (j = 0; j < BOARD_WIDTH; j++)
-           if (board[i][j] != lastBoard[i][j]) {
-               DrawSquare(i, j, board[i][j], do_flash);
+      /* Second pass -- Draw piece(s) in new position and flash them */
+      for (i = 0; i < BOARD_HEIGHT; i++)
+       for (j = 0; j < BOARD_WIDTH; j++)
+         if (board[i][j] != lastBoard[i][j])
+           {
+             DrawSquare(i, j, board[i][j], do_flash);
            }
-    } else {
-       if (lineGap > 0)
-         XDrawSegments(xDisplay, xBoardWindow, lineGC,
-                       gridSegments, BOARD_HEIGHT + BOARD_WIDTH + 2);
+    }
+  else
+    {
+      /* redraw Grid */
+      if (lineGap > 0)
+       {
+         int x1,x2,y1,y2;
+         cairo_t *cr;
 
-       for (i = 0; i < BOARD_HEIGHT; i++)
-         for (j = 0; j < BOARD_WIDTH; j++) {
-             DrawSquare(i, j, board[i][j], 0);
-             damage[i][j] = False;
+         /* get a cairo_t */
+         cr = gdk_cairo_create (GDK_WINDOW(GUI_Board->window));
+
+         cairo_set_line_width (cr, lineGap);
+
+         /* TODO: use appdata colors */
+         cairo_set_source_rgba (cr, 0, 1, 0, 1.0);
+
+         cairo_stroke (cr);
+
+         for (i = 0; i < BOARD_HEIGHT + 1; i++)
+           {
+             x1 = 0;
+             x2 = lineGap + BOARD_WIDTH * (squareSize + lineGap);
+             y1 = y2 = lineGap / 2 + (i * (squareSize + lineGap));
+
+             cairo_move_to (cr, x1, y1);
+             cairo_rel_line_to (cr, x2,0);
+             cairo_stroke (cr);
+           }
+
+         for (j = 0; j < BOARD_WIDTH + 1; j++)
+           {
+             y1 = 0;
+             y2 = lineGap + BOARD_HEIGHT * (squareSize + lineGap);
+             x1 = x2  = lineGap / 2 + (j * (squareSize + lineGap));
+
+             cairo_move_to (cr, x1, y1);
+             cairo_rel_line_to (cr, 0, y2);
+             cairo_stroke (cr);
+           }
+
+         /* free memory */
+         cairo_destroy (cr);
+       }
+
+      /* draw pieces */
+      for (i = 0; i < BOARD_HEIGHT; i++)
+       for (j = 0; j < BOARD_WIDTH; j++)
+         {
+           DrawSquare(i, j, board[i][j], 0);
+           damage[i][j] = False;
          }
     }
 
-    CopyBoard(lastBoard, board);
-    lastBoardValid = 1;
-    lastFlipView = flipView;
+  CopyBoard(lastBoard, board);
+  lastBoardValid = 1;
+  lastFlipView = flipView;
 
-    /* Draw highlights */
-    if (pm1X >= 0 && pm1Y >= 0) {
-      drawHighlight(pm1X, pm1Y, prelineGC);
+  /* Draw highlights */
+  if (pm1X >= 0 && pm1Y >= 0)
+    {
+      drawHighlight(pm1X, pm1Y, LINE_TYPE_PRE);
     }
-    if (pm2X >= 0 && pm2Y >= 0) {
-      drawHighlight(pm2X, pm2Y, prelineGC);
+  if (pm2X >= 0 && pm2Y >= 0)
+    {
+      drawHighlight(pm2X, pm2Y, LINE_TYPE_PRE);
     }
-    if (hi1X >= 0 && hi1Y >= 0) {
-      drawHighlight(hi1X, hi1Y, highlineGC);
+  if (hi1X >= 0 && hi1Y >= 0)
+    {
+      drawHighlight(hi1X, hi1Y, LINE_TYPE_HIGHLIGHT);
     }
-    if (hi2X >= 0 && hi2Y >= 0) {
-      drawHighlight(hi2X, hi2Y, highlineGC);
+  if (hi2X >= 0 && hi2Y >= 0)
+    {
+      drawHighlight(hi2X, hi2Y, LINE_TYPE_HIGHLIGHT);
     }
 
-    /* If piece being dragged around board, must redraw that too */
-    DrawDragPiece();
-
-    XSync(xDisplay, False);
-}
-
+  /* If piece being dragged around board, must redraw that too */
+  DrawDragPiece();
 
-/*
- * event handler for redrawing the board
- */
-void DrawPositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    XDrawPosition(w, True, NULL);
+  return;
 }
 
-
 /*
  * event handler for parsing user moves
  */
@@ -5133,8 +3983,8 @@ void HandleUserMove(w, event, prms, nprms)
 
     if (promotionUp) {
        if (event->type == ButtonPress) {
-           XtPopdown(promotionShell);
-           XtDestroyWidget(promotionShell);
+//         XtPopdown(promotionShell);
+//         XtDestroyWidget(promotionShell);
            promotionUp = False;
            ClearHighlights();
            fromX = fromY = -1;
@@ -5625,138 +4475,6 @@ void CommentPopDown()
     commentUp = False;
 }
 
-void FileNamePopUp(label, def, proc, openMode)
-     char *label;
-     char *def;
-     FileProc proc;
-     char *openMode;
-{
-    Arg args[16];
-    Widget popup, layout, dialog, edit;
-    Window root, child;
-    int x, y, i;
-    int win_x, win_y;
-    unsigned int mask;
-
-    fileProc = proc;           /* I can't see a way not */
-    fileOpenMode = openMode;   /*   to use globals here */
-
-    i = 0;
-    XtSetArg(args[i], XtNresizable, True); i++;
-    XtSetArg(args[i], XtNwidth, DIALOG_SIZE); i++;
-    XtSetArg(args[i], XtNtitle, XtNewString(_("File name prompt"))); i++;
-    fileNameShell = popup =
-      XtCreatePopupShell("File name prompt", transientShellWidgetClass,
-                        shellWidget, args, i);
-
-    layout =
-      XtCreateManagedWidget(layoutName, formWidgetClass, popup,
-                           layoutArgs, XtNumber(layoutArgs));
-
-    i = 0;
-    XtSetArg(args[i], XtNlabel, label); i++;
-    XtSetArg(args[i], XtNvalue, def); i++;
-    XtSetArg(args[i], XtNborderWidth, 0); i++;
-    dialog = XtCreateManagedWidget("fileName", dialogWidgetClass,
-                                  layout, args, i);
-
-    XawDialogAddButton(dialog, _("ok"), FileNameCallback, (XtPointer) dialog);
-    XawDialogAddButton(dialog, _("cancel"), FileNameCallback,
-                      (XtPointer) dialog);
-
-    XtRealizeWidget(popup);
-    CatchDeleteWindow(popup, "FileNamePopDown");
-
-    XQueryPointer(xDisplay, xBoardWindow, &root, &child,
-                 &x, &y, &win_x, &win_y, &mask);
-
-    XtSetArg(args[0], XtNx, x - 10);
-    XtSetArg(args[1], XtNy, y - 30);
-    XtSetValues(popup, args, 2);
-
-    XtPopup(popup, XtGrabExclusive);
-    filenameUp = True;
-
-    edit = XtNameToWidget(dialog, "*value");
-    XtSetKeyboardFocus(popup, edit);
-}
-
-void FileNamePopDown()
-{
-    if (!filenameUp) return;
-    XtPopdown(fileNameShell);
-    XtDestroyWidget(fileNameShell);
-    filenameUp = False;
-    ModeHighlight();
-}
-
-void FileNameCallback(w, client_data, call_data)
-     Widget w;
-     XtPointer client_data, call_data;
-{
-    String name;
-    Arg args[16];
-
-    XtSetArg(args[0], XtNlabel, &name);
-    XtGetValues(w, args, 1);
-
-    if (strcmp(name, _("cancel")) == 0) {
-        FileNamePopDown();
-        return;
-    }
-
-    FileNameAction(w, NULL, NULL, NULL);
-}
-
-void FileNameAction(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    char buf[MSG_SIZ];
-    String name;
-    FILE *f;
-    char *p, *fullname;
-    int index;
-
-    name = XawDialogGetValueString(w = XtParent(w));
-
-    if ((name != NULL) && (*name != NULLCHAR)) {
-       strcpy(buf, name);
-       XtPopdown(w = XtParent(XtParent(w)));
-       XtDestroyWidget(w);
-       filenameUp = False;
-
-       p = strrchr(buf, ' ');
-       if (p == NULL) {
-           index = 0;
-       } else {
-           *p++ = NULLCHAR;
-           index = atoi(p);
-       }
-       fullname = ExpandPathName(buf);
-       if (!fullname) {
-           ErrorPopUp(_("Error"), _("Can't open file"), FALSE);
-       }
-       else {
-           f = fopen(fullname, fileOpenMode);
-           if (f == NULL) {
-               DisplayError(_("Failed to open file"), errno);
-           } else {
-               (void) (*fileProc)(f, index, buf);
-           }
-       }
-       ModeHighlight();
-       return;
-    }
-
-    XtPopdown(w = XtParent(XtParent(w)));
-    XtDestroyWidget(w);
-    filenameUp = False;
-    ModeHighlight();
-}
-
 void PromotionPopUp()
 {
     Arg args[16];
@@ -5799,8 +4517,8 @@ void PromotionPopUp()
       XawDialogAddButton(dialog, _("King"), PromotionCallback,
                         (XtPointer) dialog);
     }
-    if(gameInfo.variant == VariantCapablanca || 
-       gameInfo.variant == VariantGothic || 
+    if(gameInfo.variant == VariantCapablanca ||
+       gameInfo.variant == VariantGothic ||
        gameInfo.variant == VariantCapaRandom) {
       XawDialogAddButton(dialog, _("Archbishop"), PromotionCallback,
                         (XtPointer) dialog);
@@ -5899,77 +4617,41 @@ void ErrorPopDown()
 {
     if (!errorUp) return;
     errorUp = False;
-    XtPopdown(errorShell);
-    XtDestroyWidget(errorShell);
+
+    if(GUI_Error)
+      gtk_widget_destroy(GTK_WIDGET(GUI_Error));
+
     if (errorExitStatus != -1) ExitEvent(errorExitStatus);
+
+    return;
 }
 
 void ErrorPopUp(title, label, modal)
      char *title, *label;
      int modal;
 {
-    Arg args[16];
-    Widget dialog, layout;
-    Position x, y;
-    int xx, yy;
-    Window junk;
-    Dimension bw_width, pw_width;
-    Dimension pw_height;
-    int i;
-
-    i = 0;
-    XtSetArg(args[i], XtNresizable, True);  i++;
-    XtSetArg(args[i], XtNtitle, title); i++;
-    errorShell =
-      XtCreatePopupShell("errorpopup", transientShellWidgetClass,
-                        shellWidget, args, i);
-    layout =
-      XtCreateManagedWidget(layoutName, formWidgetClass, errorShell,
-                           layoutArgs, XtNumber(layoutArgs));
-
-    i = 0;
-    XtSetArg(args[i], XtNlabel, label); i++;
-    XtSetArg(args[i], XtNborderWidth, 0); i++;
-    dialog = XtCreateManagedWidget("dialog", dialogWidgetClass,
-                                  layout, args, i);
-
-    XawDialogAddButton(dialog, _("ok"), ErrorCallback, (XtPointer) dialog);
-
-    XtRealizeWidget(errorShell);
-    CatchDeleteWindow(errorShell, "ErrorPopDown");
+  GUI_Error = gtk_message_dialog_new(GTK_WINDOW(GUI_Window),
+                                  GTK_DIALOG_DESTROY_WITH_PARENT,
+                                  GTK_MESSAGE_ERROR,
+                                  GTK_BUTTONS_CLOSE,
+                                  (gchar *)label);
 
-    i = 0;
-    XtSetArg(args[i], XtNwidth, &bw_width);  i++;
-    XtGetValues(boardWidget, args, i);
-    i = 0;
-    XtSetArg(args[i], XtNwidth, &pw_width);  i++;
-    XtSetArg(args[i], XtNheight, &pw_height);  i++;
-    XtGetValues(errorShell, args, i);
-
-#ifdef NOTDEF
-    /* This code seems to tickle an X bug if it is executed too soon
-       after xboard starts up.  The coordinates get transformed as if
-       the main window was positioned at (0, 0).
-       */
-    XtTranslateCoords(boardWidget, (bw_width - pw_width) / 2,
-                     0 - pw_height + squareSize / 3, &x, &y);
-#else
-    XTranslateCoordinates(xDisplay, XtWindow(boardWidget),
-                         RootWindowOfScreen(XtScreen(boardWidget)),
-                         (bw_width - pw_width) / 2,
-                         0 - pw_height + squareSize / 3, &xx, &yy, &junk);
-    x = xx;
-    y = yy;
-#endif
-    if (y < 0) y = 0; /*avoid positioning top offscreen*/
-
-    i = 0;
-    XtSetArg(args[i], XtNx, x);  i++;
-    XtSetArg(args[i], XtNy, y);  i++;
-    XtSetValues(errorShell, args, i);
+  gtk_window_set_title(GTK_WINDOW(GUI_Error),(gchar *) title);
+  if(modal)
+    {
+      gtk_dialog_run(GTK_DIALOG(GUI_Error));
+      gtk_widget_destroy(GTK_WIDGET(GUI_Error));
+    }
+  else
+    {
+      g_signal_connect_swapped (GUI_Error, "response",
+                                G_CALLBACK (ErrorPopDownProc),
+                                GUI_Error);
+      errorUp = True;
+      gtk_widget_show(GTK_WIDGET(GUI_Error));
+    }
 
-    errorUp = True;
-    XtPopup(errorShell, modal ? XtGrabExclusive : XtGrabNone);
+  return;
 }
 
 /* Disable all user input other than deleting the window */
@@ -5978,7 +4660,7 @@ void FreezeUI()
 {
   if (frozen) return;
   /* Grab by a widget that doesn't accept input */
-  XtAddGrab(messageWidget, TRUE, FALSE);
+  //  XtAddGrab(messageWidget, TRUE, FALSE);
   frozen = 1;
 }
 
@@ -5986,7 +4668,7 @@ void FreezeUI()
 void ThawUI()
 {
   if (!frozen) return;
-  XtRemoveGrab(messageWidget);
+  //  XtRemoveGrab(messageWidget);
   frozen = 0;
 }
 
@@ -6034,69 +4716,43 @@ char *ModeToWidgetName(mode)
 
 void ModeHighlight()
 {
-    Arg args[16];
     static int oldPausing = FALSE;
     static GameMode oldmode = (GameMode) -1;
     char *wname;
 
-    if (!boardWidget || !XtIsRealized(boardWidget)) return;
+   // todo this toggling of the pause button doesn't seem to work?
+    // e.g. select pause from buttonbar doesn't activate menumode.pause
+
+    //    if (!boardWidget || !XtIsRealized(boardWidget)) return;
 
     if (pausing != oldPausing) {
-       oldPausing = pausing;
+      oldPausing = pausing;
+      gtk_button_set_relief(GTK_BUTTON (gtk_builder_get_object (builder, "menuMode.Pause")),pausing?GTK_RELIEF_NORMAL:GTK_RELIEF_NONE);
+      /* toggle background color in showbuttonbar */
+      if (appData.showButtonBar) {
        if (pausing) {
-           XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
+         gtk_button_pressed(GTK_BUTTON (gtk_builder_get_object (builder, "buttonbar.Pause")));
        } else {
-           XtSetArg(args[0], XtNleftBitmap, None);
-       }
-       XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Pause"),
-                   args, 1);
-
-       if (appData.showButtonBar) {
-         /* Always toggle, don't set.  Previous code messes up when
-            invoked while the button is pressed, as releasing it
-            toggles the state again. */
-         {
-           Pixel oldbg, oldfg;
-           XtSetArg(args[0], XtNbackground, &oldbg);
-           XtSetArg(args[1], XtNforeground, &oldfg);
-           XtGetValues(XtNameToWidget(buttonBarWidget, PAUSE_BUTTON),
-                       args, 2);
-           XtSetArg(args[0], XtNbackground, oldfg);
-           XtSetArg(args[1], XtNforeground, oldbg);
-         }
-         XtSetValues(XtNameToWidget(buttonBarWidget, PAUSE_BUTTON), args, 2);
+         gtk_button_released(GTK_BUTTON (gtk_builder_get_object (builder, "buttonbar.Pause")));
        }
+      }
     }
 
     wname = ModeToWidgetName(oldmode);
-    if (wname != NULL) {
-       XtSetArg(args[0], XtNleftBitmap, None);
-       XtSetValues(XtNameToWidget(menuBarWidget, wname), args, 1);
-    }
-    wname = ModeToWidgetName(gameMode);
-    if (wname != NULL) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-       XtSetValues(XtNameToWidget(menuBarWidget, wname), args, 1);
-    }
+    if(wname)
+       gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, wname)),True);
+
     oldmode = gameMode;
 
     /* Maybe all the enables should be handled here, not just this one */
-    XtSetSensitive(XtNameToWidget(menuBarWidget, "menuMode.Training"),
-                  gameMode == Training || gameMode == PlayFromGameFile);
+    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (gtk_builder_get_object (builder, "menuMode.Training")),
+                            gameMode == Training || gameMode == PlayFromGameFile);
 }
 
 
 /*
  * Button/menu procedures
  */
-void ResetProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ResetGameEvent();
-}
 
 int LoadGamePopUp(f, gameNumber, title)
      FILE *f;
@@ -6104,119 +4760,28 @@ int LoadGamePopUp(f, gameNumber, title)
      char *title;
 {
     cmailMsgLoaded = FALSE;
-    if (gameNumber == 0) {
+
+    if (gameNumber == 0) 
+      {
        int error = GameListBuild(f);
-       if (error) {
+
+       if (error) 
+         {
            DisplayError(_("Cannot build game list"), error);
-       } else if (!ListEmpty(&gameList) &&
-                  ((ListGame *) gameList.tailPred)->number > 1) {
-           GameListPopUp(f, title);
+         } 
+       else if (!ListEmpty(&gameList) 
+                && ((ListGame *) gameList.tailPred)->number > 1) 
+         {
+           // TODO convert to GTK
+           //      GameListPopUp(f, title);
            return TRUE;
-       }
+         };
+
        GameListDestroy();
        gameNumber = 1;
-    }
-    return LoadGame(f, gameNumber, title, FALSE);
-}
-
-void LoadGameProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) {
-       Reset(FALSE, TRUE);
-    }
-    FileNamePopUp(_("Load game file name?"), "", LoadGamePopUp, "rb");
-}
-
-void LoadNextGameProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ReloadGame(1);
-}
-
-void LoadPrevGameProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ReloadGame(-1);
-}
-
-void ReloadGameProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ReloadGame(0);
-}
-
-void LoadNextPositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ReloadPosition(1);
-}
-
-void LoadPrevPositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ReloadPosition(-1);
-}
-
-void ReloadPositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ReloadPosition(0);
-}
-
-void LoadPositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) {
-       Reset(FALSE, TRUE);
-    }
-    FileNamePopUp(_("Load position file name?"), "", LoadPosition, "rb");
-}
-
-void SaveGameProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    FileNamePopUp(_("Save game file name?"),
-                 DefaultFileName(appData.oldSaveStyle ? "game" : "pgn"),
-                 SaveGame, "a");
-}
+      };
 
-void SavePositionProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    FileNamePopUp(_("Save position file name?"),
-                 DefaultFileName(appData.oldSaveStyle ? "pos" : "fen"),
-                 SavePosition, "a");
+    return LoadGame(f, gameNumber, title, FALSE);
 }
 
 void ReloadCmailMsgProc(w, event, prms, nprms)
@@ -6418,45 +4983,8 @@ void PasteGameProc(w, event, prms, nprms)
 
 void AutoSaveGame()
 {
-    SaveGameProc(NULL, NULL, NULL, NULL);
-}
-
-
-void QuitProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ExitEvent(0);
-}
-
-void PauseProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    PauseEvent();
-}
-
-
-void MachineBlackProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    MachineBlackEvent();
-}
-
-void MachineWhiteProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    MachineWhiteEvent();
+  SaveGameProc(NULL, NULL);
+  return;
 }
 
 void AnalyzeModeProc(w, event, prms, nprms)
@@ -6497,51 +5025,11 @@ void AnalyzeModeProc(w, event, prms, nprms)
             fprintf(debugFP, _("ICS engine analyze starting... \n"));
     }
     if (!appData.showThinking)
-      ShowThinkingProc(w,event,prms,nprms);
+      ShowThinkingProc(NULL,NULL);
 
     AnalyzeModeEvent();
 }
 
-void AnalyzeFileProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    if (!first.analysisSupport) {
-      char buf[MSG_SIZ];
-      snprintf(buf, sizeof(buf), _("%s does not support analysis"), first.tidy);
-      DisplayError(buf, 0);
-      return;
-    }
-    Reset(FALSE, TRUE);
-
-    if (!appData.showThinking)
-      ShowThinkingProc(w,event,prms,nprms);
-
-    AnalyzeFileEvent();
-    FileNamePopUp(_("File to analyze"), "", LoadGamePopUp, "rb");
-    AnalysisPeriodicEvent(1);
-}
-
-void TwoMachinesProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    TwoMachinesEvent();
-}
-
-void IcsClientProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    IcsClientEvent();
-}
-
 void EditGameProc(w, event, prms, nprms)
      Widget w;
      XEvent *event;
@@ -6595,104 +5083,6 @@ void IcsInputBoxProc(w, event, prms, nprms)
     }
 }
 
-void AcceptProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    AcceptEvent();
-}
-
-void DeclineProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    DeclineEvent();
-}
-
-void RematchProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    RematchEvent();
-}
-
-void CallFlagProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    CallFlagEvent();
-}
-
-void DrawProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    DrawEvent();
-}
-
-void AbortProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    AbortEvent();
-}
-
-void AdjournProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    AdjournEvent();
-}
-
-void ResignProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ResignEvent();
-}
-
-void AdjuWhiteProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    UserAdjudicationEvent(+1);
-}
-
-void AdjuBlackProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    UserAdjudicationEvent(-1);
-}
-
-void AdjuDrawProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    UserAdjudicationEvent(0);
-}
 
 void EnterKeyProc(w, event, prms, nprms)
      Widget w;
@@ -6704,482 +5094,6 @@ void EnterKeyProc(w, event, prms, nprms)
       ICSInputSendText();
 }
 
-void StopObservingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    StopObservingEvent();
-}
-
-void StopExaminingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    StopExaminingEvent();
-}
-
-
-void ForwardProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ForwardEvent();
-}
-
-
-void BackwardProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    BackwardEvent();
-}
-
-void ToStartProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ToStartEvent();
-}
-
-void ToEndProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    ToEndEvent();
-}
-
-void RevertProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    RevertEvent();
-}
-
-void TruncateGameProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    TruncateGameEvent();
-}
-void RetractMoveProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    RetractMoveEvent();
-}
-
-void MoveNowProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    MoveNowEvent();
-}
-
-
-void AlwaysQueenProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.alwaysPromoteToQueen = !appData.alwaysPromoteToQueen;
-
-    if (appData.alwaysPromoteToQueen) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Always Queen"),
-               args, 1);
-}
-
-void AnimateDraggingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.animateDragging = !appData.animateDragging;
-
-    if (appData.animateDragging) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-        CreateAnimVars();
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Animate Dragging"),
-               args, 1);
-}
-
-void AnimateMovingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.animate = !appData.animate;
-
-    if (appData.animate) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-        CreateAnimVars();
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Animate Moving"),
-               args, 1);
-}
-
-void AutocommProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.autoComment = !appData.autoComment;
-
-    if (appData.autoComment) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Comment"),
-               args, 1);
-}
-
-
-void AutoflagProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.autoCallFlag = !appData.autoCallFlag;
-
-    if (appData.autoCallFlag) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Flag"),
-               args, 1);
-}
-
-void AutoflipProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.autoFlipView = !appData.autoFlipView;
-
-    if (appData.autoFlipView) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Flip View"),
-               args, 1);
-}
-
-void AutobsProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.autoObserve = !appData.autoObserve;
-
-    if (appData.autoObserve) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Observe"),
-               args, 1);
-}
-
-void AutoraiseProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.autoRaiseBoard = !appData.autoRaiseBoard;
-
-    if (appData.autoRaiseBoard) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Raise Board"),
-               args, 1);
-}
-
-void AutosaveProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.autoSaveGames = !appData.autoSaveGames;
-
-    if (appData.autoSaveGames) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Auto Save"),
-               args, 1);
-}
-
-void BlindfoldProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.blindfold = !appData.blindfold;
-
-    if (appData.blindfold) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Blindfold"),
-               args, 1);
-
-    DrawPosition(True, NULL);
-}
-
-void TestLegalityProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.testLegality = !appData.testLegality;
-
-    if (appData.testLegality) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Test Legality"),
-               args, 1);
-}
-
-
-void FlashMovesProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    if (appData.flashCount == 0) {
-       appData.flashCount = 3;
-    } else {
-       appData.flashCount = -appData.flashCount;
-    }
-
-    if (appData.flashCount > 0) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Flash Moves"),
-               args, 1);
-}
-
-void FlipViewProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    flipView = !flipView;
-    DrawPosition(True, NULL);
-}
-
-void GetMoveListProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.getMoveList = !appData.getMoveList;
-
-    if (appData.getMoveList) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-       GetMoveListEvent();
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Get Move List"),
-               args, 1);
-}
-
-#if HIGHDRAG
-void HighlightDraggingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.highlightDragging = !appData.highlightDragging;
-
-    if (appData.highlightDragging) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget,
-                              "menuOptions.Highlight Dragging"), args, 1);
-}
-#endif
-
-void HighlightLastMoveProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.highlightLastMove = !appData.highlightLastMove;
-
-    if (appData.highlightLastMove) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget,
-                              "menuOptions.Highlight Last Move"), args, 1);
-}
-
-void IcsAlarmProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.icsAlarm = !appData.icsAlarm;
-
-    if (appData.icsAlarm) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget,
-                              "menuOptions.ICS Alarm"), args, 1);
-}
-
-void MoveSoundProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.ringBellAfterMoves = !appData.ringBellAfterMoves;
-
-    if (appData.ringBellAfterMoves) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Move Sound"),
-               args, 1);
-}
-
-
-void OldSaveStyleProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.oldSaveStyle = !appData.oldSaveStyle;
-
-    if (appData.oldSaveStyle) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Old Save Style"),
-               args, 1);
-}
-
-void PeriodicUpdatesProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    PeriodicUpdatesEvent(!appData.periodicUpdates);
-
-    if (appData.periodicUpdates) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Periodic Updates"),
-               args, 1);
-}
 
 void PonderNextMoveProc(w, event, prms, nprms)
      Widget w;
@@ -7276,127 +5190,6 @@ void QuietPlayProc(w, event, prms, nprms)
                args, 1);
 }
 
-void ShowCoordsProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.showCoords = !appData.showCoords;
-
-    if (appData.showCoords) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Show Coords"),
-               args, 1);
-
-    DrawPosition(True, NULL);
-}
-
-void ShowThinkingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.showThinking = !appData.showThinking; // [HGM] thinking: tken out of ShowThinkingEvent
-    ShowThinkingEvent();
-}
-
-void HideThinkingProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    Arg args[16];
-
-    appData.hideThinkingFromHuman = !appData.hideThinkingFromHuman; // [HGM] thinking: tken out of ShowThinkingEvent
-    ShowThinkingEvent();
-
-    if (appData.hideThinkingFromHuman) {
-       XtSetArg(args[0], XtNleftBitmap, xMarkPixmap);
-    } else {
-       XtSetArg(args[0], XtNleftBitmap, None);
-    }
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Hide Thinking"),
-               args, 1);
-}
-
-void InfoProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    char buf[MSG_SIZ];
-    snprintf(buf, sizeof(buf), "xterm -e info --directory %s --directory . -f %s &",
-           INFODIR, INFOFILE);
-    system(buf);
-}
-
-void ManProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    char buf[MSG_SIZ];
-    String name;
-    if (nprms && *nprms > 0)
-      name = prms[0];
-    else
-      name = "xboard";
-    snprintf(buf, sizeof(buf), "xterm -e man %s &", name);
-    system(buf);
-}
-
-void HintProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    HintEvent();
-}
-
-void BookProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    BookEvent();
-}
-
-void AboutProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
-{
-    char buf[MSG_SIZ];
-#if ZIPPY
-    char *zippy = " (with Zippy code)";
-#else
-    char *zippy = "";
-#endif
-    snprintf(buf, sizeof(buf), "%s%s\n\n%s\n%s\n%s\n\n%s%s\n%s",
-           programVersion, zippy,
-           "Copyright 1991 Digital Equipment Corporation",
-           "Enhancements Copyright 1992-2009 Free Software Foundation",
-           "Enhancements Copyright 2005 Alessandro Scotti",
-           PACKAGE, " is free software and carries NO WARRANTY;",
-           "see the file COPYING for more information.");
-    ErrorPopUp(_("About XBoard"), buf, FALSE);
-}
-
 void DebugProc(w, event, prms, nprms)
      Widget w;
      XEvent *event;
@@ -7438,85 +5231,72 @@ void Iconify(w, event, prms, nprms)
 }
 
 void DisplayMessage(message, extMessage)
-     char *message, *extMessage;
+     gchar *message, *extMessage;
 {
-  /* display a message in the message widget */
-  
-  char buf[MSG_SIZ];
-  Arg arg;
-  
-  if (extMessage) 
-    {
-      if (*message) 
-       {
-         snprintf(buf, sizeof(buf), "%s  %s", message, extMessage);
-         message = buf;
-       } 
-      else 
-       {
-         message = extMessage;
-       };
-    };
-  
-  /* need to test if messageWidget already exists, since this function
-     can also be called during the startup, if for example a Xresource
-     is not set up correctly */
-  if(messageWidget)
-    {
-      XtSetArg(arg, XtNlabel, message);
-      XtSetValues(messageWidget, &arg, 1);
-    };
-  
-  return;
+    char buf[MSG_SIZ];
+    Arg arg;
+
+    if (extMessage) {
+       if (*message) {
+           snprintf(buf, sizeof(buf), "%s  %s", message, extMessage);
+           message = buf;
+       } else {
+           message = extMessage;
+       }
+    }
+    gtk_label_set_text( GTK_LABEL(gtk_builder_get_object (builder, "Messages")),message);
+
+    return;
 }
 
 void DisplayTitle(text)
      char *text;
 {
-    Arg args[16];
-    int i;
-    char title[MSG_SIZ];
-    char icon[MSG_SIZ];
+    gchar title[MSG_SIZ];
 
     if (text == NULL) text = "";
 
-    if (appData.titleInWindow) {
-       i = 0;
-       XtSetArg(args[i], XtNlabel, text);   i++;
-       XtSetValues(titleWidget, args, i);
-    }
+    if (appData.titleInWindow)
+      {
+       /* TODO */
+      }
 
-    if (*text != NULLCHAR) {
-       strcpy(icon, text);
+    if (*text != NULLCHAR)
+      {
        strcpy(title, text);
-    } else if (appData.icsActive) {
-        snprintf(icon, sizeof(icon), "%s", appData.icsHost);
+      }
+    else if (appData.icsActive)
+      {
        snprintf(title, sizeof(title), "%s: %s", programName, appData.icsHost);
-    } else if (appData.cmailGameName[0] != NULLCHAR) {
-        snprintf(icon, sizeof(icon), "%s", "CMail");
+      }
+    else if (appData.cmailGameName[0] != NULLCHAR)
+      {
        snprintf(title,sizeof(title), "%s: %s", programName, "CMail");
 #ifdef GOTHIC
     // [HGM] license: This stuff should really be done in back-end, but WinBoard already had a pop-up for it
-    } else if (gameInfo.variant == VariantGothic) {
-       strcpy(icon, programName);
+      }
+    else if (gameInfo.variant == VariantGothic)
+      {
        strcpy(title, GOTHIC);
 #endif
 #ifdef FALCON
-    } else if (gameInfo.variant == VariantFalcon) {
-       strcpy(icon, programName);
+      }
+    else if (gameInfo.variant == VariantFalcon)
+      {
        strcpy(title, FALCON);
 #endif
-    } else if (appData.noChessProgram) {
-       strcpy(icon, programName);
+      }
+    else if (appData.noChessProgram)
+      {
        strcpy(title, programName);
-    } else {
-       strcpy(icon, first.tidy);
+      }
+    else
+      {
        snprintf(title,sizeof(title), "%s: %s", programName, first.tidy);
-    }
-    i = 0;
-    XtSetArg(args[i], XtNiconName, (XtArgVal) icon);    i++;
-    XtSetArg(args[i], XtNtitle, (XtArgVal) title);      i++;
-    XtSetValues(shellWidget, args, i);
+      }
+    gtk_window_set_title(GTK_WINDOW(GUI_Window),title);
+
+    return;
 }
 
 
@@ -7944,60 +5724,72 @@ char *HostName()
 #endif /* not HAVE_GETHOSTNAME */
 }
 
-XtIntervalId delayedEventTimerXID = 0;
+guint delayedEventTimerTag = 0;
 DelayedEventCallback delayedEventCallback = 0;
 
 void
-FireDelayedEvent()
+FireDelayedEvent(data)
+     gpointer data;
 {
-    delayedEventTimerXID = 0;
-    delayedEventCallback();
+  /* remove timer */
+  g_source_remove(delayedEventTimerTag);
+  delayedEventTimerTag = 0;
+
+  /* call function */
+  delayedEventCallback();
+
+  return;
 }
 
 void
 ScheduleDelayedEvent(cb, millisec)
-     DelayedEventCallback cb; long millisec;
+     DelayedEventCallback cb; guint millisec;
 {
-    if(delayedEventTimerXID && delayedEventCallback == cb)
+    if(delayedEventTimerTag && delayedEventCallback == cb)
        // [HGM] alive: replace, rather than add or flush identical event
-       XtRemoveTimeOut(delayedEventTimerXID);
+       g_source_remove(delayedEventTimerTag);
     delayedEventCallback = cb;
-    delayedEventTimerXID =
-      XtAppAddTimeOut(appContext, millisec,
-                     (XtTimerCallbackProc) FireDelayedEvent, (XtPointer) 0);
+    delayedEventTimerTag = g_timeout_add(millisec,(GSourceFunc) FireDelayedEvent, NULL);
+    return;
 }
 
 DelayedEventCallback
 GetDelayedEvent()
 {
-  if (delayedEventTimerXID) {
-    return delayedEventCallback;
-  } else {
-    return NULL;
-  }
+  if (delayedEventTimerTag)
+    {
+      return delayedEventCallback;
+    }
+  else
+    {
+      return NULL;
+    }
 }
 
 void
 CancelDelayedEvent()
 {
-  if (delayedEventTimerXID) {
-    XtRemoveTimeOut(delayedEventTimerXID);
-    delayedEventTimerXID = 0;
-  }
+  if (delayedEventTimerTag)
+    {
+      g_source_remove(delayedEventTimerTag);
+      delayedEventTimerTag = 0;
+    }
+
+  return;
 }
 
-XtIntervalId loadGameTimerXID = 0;
+guint loadGameTimerTag = 0;
 
 int LoadGameTimerRunning()
 {
-    return loadGameTimerXID != 0;
+    return loadGameTimerTag != 0;
 }
 
 int StopLoadGameTimer()
 {
-    if (loadGameTimerXID != 0) {
-       XtRemoveTimeOut(loadGameTimerXID);
-       loadGameTimerXID = 0;
+    if (loadGameTimerTag != 0) {
+       g_source_remove(loadGameTimerTag);
+       loadGameTimerTag = 0;
        return TRUE;
     } else {
        return FALSE;
@@ -8005,120 +5797,134 @@ int StopLoadGameTimer()
 }
 
 void
-LoadGameTimerCallback(arg, id)
-     XtPointer arg;
-     XtIntervalId *id;
+LoadGameTimerCallback(data)
+     gpointer data;
 {
-    loadGameTimerXID = 0;
-    AutoPlayGameLoop();
+  /* remove timer */
+  g_source_remove(loadGameTimerTag);
+  loadGameTimerTag = 0;
+
+  AutoPlayGameLoop();
+  return;
 }
 
 void
 StartLoadGameTimer(millisec)
      long millisec;
 {
-    loadGameTimerXID =
-      XtAppAddTimeOut(appContext, millisec,
-                     (XtTimerCallbackProc) LoadGameTimerCallback,
-                     (XtPointer) 0);
+  loadGameTimerTag =
+    g_timeout_add( millisec, (GSourceFunc) LoadGameTimerCallback, NULL);
+  return;
 }
 
-XtIntervalId analysisClockXID = 0;
+guint analysisClockTag = 0;
 
-void
-AnalysisClockCallback(arg, id)
-     XtPointer arg;
-     XtIntervalId *id;
+gboolean
+AnalysisClockCallback(data)
+     gpointer data;
 {
     if (gameMode == AnalyzeMode || gameMode == AnalyzeFile
-         || appData.icsEngineAnalyze) { // [DM]
+         || appData.icsEngineAnalyze)
+      {
        AnalysisPeriodicEvent(0);
-       StartAnalysisClock();
-    }
+       return 1; /* keep on going */
+      }
+    return 0; /* stop timer */
 }
 
 void
 StartAnalysisClock()
 {
-    analysisClockXID =
-      XtAppAddTimeOut(appContext, 2000,
-                     (XtTimerCallbackProc) AnalysisClockCallback,
-                     (XtPointer) 0);
+  analysisClockTag =
+    g_timeout_add( 2000,(GSourceFunc) AnalysisClockCallback, NULL);
+  return;
 }
 
-XtIntervalId clockTimerXID = 0;
+guint clockTimerTag = 0;
 
 int ClockTimerRunning()
 {
-    return clockTimerXID != 0;
+    return clockTimerTag != 0;
 }
 
 int StopClockTimer()
 {
-    if (clockTimerXID != 0) {
-       XtRemoveTimeOut(clockTimerXID);
-       clockTimerXID = 0;
+    if (clockTimerTag != 0)
+      {
+       g_source_remove(clockTimerTag);
+       clockTimerTag = 0;
        return TRUE;
-    } else {
+      }
+    else
+      {
        return FALSE;
-    }
+      }
 }
 
 void
-ClockTimerCallback(arg, id)
-     XtPointer arg;
-     XtIntervalId *id;
+ClockTimerCallback(data)
+     gpointer data;
 {
-    clockTimerXID = 0;
-    DecrementClocks();
+  /* remove timer */
+  g_source_remove(clockTimerTag);
+  clockTimerTag = 0;
+
+  DecrementClocks();
+  return;
 }
 
 void
 StartClockTimer(millisec)
      long millisec;
 {
-    clockTimerXID =
-      XtAppAddTimeOut(appContext, millisec,
-                     (XtTimerCallbackProc) ClockTimerCallback,
-                     (XtPointer) 0);
+  clockTimerTag = g_timeout_add(millisec,(GSourceFunc) ClockTimerCallback,NULL);
+  return;
 }
 
 void
 DisplayTimerLabel(w, color, timer, highlight)
-     Widget w;
+     GtkWidget *w;
      char *color;
      long timer;
      int highlight;
 {
-    char buf[MSG_SIZ];
-    Arg args[16];
+  gchar buf[MSG_SIZ];
 
-    /* check for low time warning */
-    Pixel foregroundOrWarningColor = timerForegroundPixel;
-
-    if (timer > 0 &&
-        appData.lowTimeWarning && 
-        (timer / 1000) < appData.icsAlarmTime)
-      foregroundOrWarningColor = lowTimeWarningColor;
-
-    if (appData.clockMode) {
-       sprintf(buf, "%s: %s", color, TimeString(timer));
-       XtSetArg(args[0], XtNlabel, buf);
-    } else {
-       sprintf(buf, "%s  ", color);
-       XtSetArg(args[0], XtNlabel, buf);
-    }
-
-    if (highlight) {
-
-       XtSetArg(args[1], XtNbackground, foregroundOrWarningColor);
-       XtSetArg(args[2], XtNforeground, timerBackgroundPixel);
-    } else {
-       XtSetArg(args[1], XtNbackground, timerBackgroundPixel);
-       XtSetArg(args[2], XtNforeground, foregroundOrWarningColor);
-    }
 
-    XtSetValues(w, args, 3);
+  if (appData.clockMode) {
+    sprintf(buf, "%s: %s", color, TimeString(timer));
+  } else {
+    sprintf(buf, "%s  ", color);
+  }
+  gtk_label_set_text(GTK_LABEL(w),buf);
+
+  /* check for low time warning */
+//    Pixel foregroundOrWarningColor = timerForegroundPixel;
+
+//    if (timer > 0 &&
+//        appData.lowTimeWarning &&
+//        (timer / 1000) < appData.icsAlarmTime)
+//      foregroundOrWarningColor = lowTimeWarningColor;
+//
+//    if (appData.clockMode) {
+//     sprintf(buf, "%s: %s", color, TimeString(timer));
+//     XtSetArg(args[0], XtNlabel, buf);
+//    } else {
+//     sprintf(buf, "%s  ", color);
+//     XtSetArg(args[0], XtNlabel, buf);
+//    }
+//
+//    if (highlight) {
+//
+//     XtSetArg(args[1], XtNbackground, foregroundOrWarningColor);
+//     XtSetArg(args[2], XtNforeground, timerBackgroundPixel);
+//    } else {
+//     XtSetArg(args[1], XtNbackground, timerBackgroundPixel);
+//     XtSetArg(args[2], XtNforeground, foregroundOrWarningColor);
+//    }
+//
+//    XtSetValues(w, args, 3);
+//
 }
 
 void
@@ -8126,14 +5932,13 @@ DisplayWhiteClock(timeRemaining, highlight)
      long timeRemaining;
      int highlight;
 {
-    Arg args[16];
+  if(appData.noGUI) return;
 
-    if(appData.noGUI) return;
-    DisplayTimerLabel(whiteTimerWidget, _("White"), timeRemaining, highlight);
-    if (highlight && iconPixmap == bIconPixmap) {
-       iconPixmap = wIconPixmap;
-       XtSetArg(args[0], XtNiconPixmap, iconPixmap);
-       XtSetValues(shellWidget, args, 1);
+  DisplayTimerLabel(GUI_Whiteclock, _("White"), timeRemaining, highlight);
+  if (highlight && WindowIcon == BlackIcon)
+    {
+      WindowIcon = WhiteIcon;
+      gtk_window_set_icon(GTK_WINDOW(GUI_Window),WindowIcon);
     }
 }
 
@@ -8142,15 +5947,14 @@ DisplayBlackClock(timeRemaining, highlight)
      long timeRemaining;
      int highlight;
 {
-    Arg args[16];
-
     if(appData.noGUI) return;
-    DisplayTimerLabel(blackTimerWidget, _("Black"), timeRemaining, highlight);
-    if (highlight && iconPixmap == wIconPixmap) {
-       iconPixmap = bIconPixmap;
-       XtSetArg(args[0], XtNiconPixmap, iconPixmap);
-       XtSetValues(shellWidget, args, 1);
-    }
+
+    DisplayTimerLabel(GUI_Blackclock, _("Black"), timeRemaining, highlight);
+    if (highlight && WindowIcon == WhiteIcon)
+      {
+        WindowIcon = BlackIcon;
+        gtk_window_set_icon(GTK_WINDOW(GUI_Window),WindowIcon);
+      }
 }
 
 #define CPNone 0
@@ -8418,51 +6222,75 @@ typedef struct {
     int lineByLine;
     char *unused;
     InputCallback func;
-    XtInputId xid;
+    guint sid;
     char buf[INPUT_SOURCE_BUF_SIZE];
     VOIDSTAR closure;
 } InputSource;
 
 void
-DoInputCallback(closure, source, xid)
-     caddr_t closure;
-     int *source;
-     XtInputId *xid;
+DoInputCallback(io,cond,data)
+     GIOChannel   *io;
+     GIOCondition  cond;
+     gpointer *data;
 {
-    InputSource *is = (InputSource *) closure;
-    int count;
-    int error;
-    char *p, *q;
+  /* read input from one of the input source (for example a chess program, ICS, etc).
+   * and call a function that will handle the input
+   */
 
-    if (is->lineByLine) {
-       count = read(is->fd, is->unused,
-                    INPUT_SOURCE_BUF_SIZE - (is->unused - is->buf));
-       if (count <= 0) {
-           (is->func)(is, is->closure, is->buf, count, count ? errno : 0);
-           return;
+  int count; /* how many bytes did we read */
+  int error; 
+  char *p, *q;
+  
+  /* All information (callback function, file descriptor, etc) is
+   * saved in an InputSource structure 
+   */
+  InputSource *is = (InputSource *) data; 
+  
+  if (is->lineByLine) 
+    {
+      count = read(is->fd, is->unused,
+                  INPUT_SOURCE_BUF_SIZE - (is->unused - is->buf));
+
+      if (count <= 0) 
+       {
+         (is->func)(is, is->closure, is->buf, count, count ? errno : 0);
+         return;
        }
-       is->unused += count;
-       p = is->buf;
-       while (p < is->unused) {
-           q = memchr(p, '\n', is->unused - p);
-           if (q == NULL) break;
-           q++;
-           (is->func)(is, is->closure, p, q - p, 0);
-           p = q;
+      is->unused += count;
+      p = is->buf;
+      /* break input into lines and call the callback function on each
+       * line 
+       */
+      while (p < is->unused) 
+       {
+         q = memchr(p, '\n', is->unused - p);
+         if (q == NULL) break;
+         q++;
+         (is->func)(is, is->closure, p, q - p, 0);
+         p = q;
        }
-       q = is->buf;
-       while (p < is->unused) {
-           *q++ = *p++;
+      /* remember not yet used part of the buffer */
+      q = is->buf;
+      while (p < is->unused) 
+       {
+         *q++ = *p++;
        }
-       is->unused = q;
-    } else {
-       count = read(is->fd, is->buf, INPUT_SOURCE_BUF_SIZE);
-       if (count == -1)
-         error = errno;
-       else
-         error = 0;
-       (is->func)(is, is->closure, is->buf, count, error);
+      is->unused = q;
+    }
+  else 
+    {
+      /* read maximum length of input buffer and send the whole buffer
+       * to the callback function 
+       */
+      count = read(is->fd, is->buf, INPUT_SOURCE_BUF_SIZE);
+      if (count == -1)
+       error = errno;
+      else
+       error = 0;
+      (is->func)(is, is->closure, is->buf, count, error);
     }
+  
+  return;
 }
 
 InputSourceRef AddInputSource(pr, lineByLine, func, closure)
@@ -8472,6 +6300,7 @@ InputSourceRef AddInputSource(pr, lineByLine, func, closure)
      VOIDSTAR closure;
 {
     InputSource *is;
+    GIOChannel *channel;
     ChildProc *cp = (ChildProc *) pr;
 
     is = (InputSource *) calloc(1, sizeof(InputSource));
@@ -8484,14 +6313,23 @@ InputSourceRef AddInputSource(pr, lineByLine, func, closure)
        is->kind = cp->kind;
        is->fd = cp->fdFrom;
     }
-    if (lineByLine) {
-       is->unused = is->buf;
-    }
+    if (lineByLine) 
+      is->unused = is->buf;
+    else
+      is->unused = NULL;
+
+//    is->xid = XtAppAddInput(appContext, is->fd,
+//                         (XtPointer) (XtInputReadMask),
+//                         (XtInputCallbackProc) DoInputCallback,
+//                         (XtPointer) is);
+//
+
+    /* TODO: will this work on windows?*/
+    printf("DEBUG: fd=%d %d\n",is->fd,is);
 
-    is->xid = XtAppAddInput(appContext, is->fd,
-                           (XtPointer) (XtInputReadMask),
-                           (XtInputCallbackProc) DoInputCallback,
-                           (XtPointer) is);
+    channel = g_io_channel_unix_new(is->fd);
+    g_io_channel_set_close_on_unref (channel, TRUE);
+    is->sid = g_io_add_watch(channel, G_IO_IN,(GIOFunc) DoInputCallback, is);
     is->closure = closure;
     return (InputSourceRef) is;
 }
@@ -8502,9 +6340,10 @@ RemoveInputSource(isr)
 {
     InputSource *is = (InputSource *) isr;
 
-    if (is->xid == 0) return;
-    XtRemoveInput(is->xid);
-    is->xid = 0;
+    if (is->sid == 0) return;
+    g_source_remove(is->sid);
+    is->sid = 0;
+    return;
 }
 
 int OutputToProcess(pr, message, count, outError)
@@ -8612,6 +6451,9 @@ CreateAnimMasks (pieceDepth)
   unsigned long        plane;
   XGCValues    values;
 
+  /* just return for gtk at the moment */
+  return;
+
   /* Need a bitmap just to get a GC with right depth */
   buf = XCreatePixmap(xDisplay, xBoardWindow,
                        8, 8, 1);
@@ -8689,27 +6531,27 @@ InitAnimState (anim, info)
   XGCValues values;
 
   /* Each buffer is square size, same depth as window */
-  anim->saveBuf = XCreatePixmap(xDisplay, xBoardWindow,
-                       squareSize, squareSize, info->depth);
-  anim->newBuf = XCreatePixmap(xDisplay, xBoardWindow,
-                       squareSize, squareSize, info->depth);
-
-  /* Create a plain GC for blitting */
-  mask = GCForeground | GCBackground | GCFunction |
-         GCPlaneMask | GCGraphicsExposures;
-  values.foreground = XBlackPixel(xDisplay, xScreen);
-  values.background = XWhitePixel(xDisplay, xScreen);
-  values.function   = GXcopy;
-  values.plane_mask = AllPlanes;
-  values.graphics_exposures = False;
-  anim->blitGC = XCreateGC(xDisplay, xBoardWindow, mask, &values);
-
-  /* Piece will be copied from an existing context at
-     the start of each new animation/drag. */
-  anim->pieceGC = XCreateGC(xDisplay, xBoardWindow, 0, &values);
-
-  /* Outline will be a read-only copy of an existing */
-  anim->outlineGC = None;
+//  anim->saveBuf = XCreatePixmap(xDisplay, xBoardWindow,
+//                     squareSize, squareSize, info->depth);
+//  anim->newBuf = XCreatePixmap(xDisplay, xBoardWindow,
+//                     squareSize, squareSize, info->depth);
+//
+//  /* Create a plain GC for blitting */
+//  mask = GCForeground | GCBackground | GCFunction |
+//         GCPlaneMask | GCGraphicsExposures;
+//  values.foreground = XBlackPixel(xDisplay, xScreen);
+//  values.background = XWhitePixel(xDisplay, xScreen);
+//  values.function   = GXcopy;
+//  values.plane_mask = AllPlanes;
+//  values.graphics_exposures = False;
+//  anim->blitGC = XCreateGC(xDisplay, xBoardWindow, mask, &values);
+//
+//  /* Piece will be copied from an existing context at
+//     the start of each new animation/drag. */
+//  anim->pieceGC = XCreateGC(xDisplay, xBoardWindow, 0, &values);
+//
+//  /* Outline will be a read-only copy of an existing */
+//  anim->outlineGC = None;
 }
 
 static void
@@ -8718,16 +6560,19 @@ CreateAnimVars ()
   static VariantClass old = (VariantClass) -1; // [HGM] pieces: redo every time variant changes
   XWindowAttributes info;
 
+  /* for gtk at the moment just ... */
+  return;
+
   if (xpmDone && gameInfo.variant == old) return;
   if(xpmDone) old = gameInfo.variant; // first time pieces might not be created yet
-  XGetWindowAttributes(xDisplay, xBoardWindow, &info);
+  //  XGetWindowAttributes(xDisplay, xBoardWindow, &info);
 
-  InitAnimState(&game, &info);
-  InitAnimState(&player, &info);
+  //  InitAnimState(&game, &info);
+  //  InitAnimState(&player, &info);
 
   /* For XPM pieces, we need bitmaps to use as masks. */
-  if (useImages)
-    CreateAnimMasks(info.depth);
+  //  if (useImages)
+  //    CreateAnimMasks(info.depth);
    xpmDone = 1;
 }
 
@@ -8772,7 +6617,7 @@ static void
 FrameDelay (time)
      int time;
 {
-  XSync(xDisplay, False);
+  //  XSync(xDisplay, False);
   if (time > 0)
     usleep(time * 1000);
 }
@@ -8968,7 +6813,7 @@ SelectGCMask(piece, clip, outline, mask)
     else
       source = blPieceGC;
   }
-  XCopyGC(xDisplay, source, 0xFFFFFFFF, *clip);
+  //  XCopyGC(xDisplay, source, 0xFFFFFFFF, *clip);
 
   /* Outline only used in mono mode and is not modified */
   if (White(piece))
@@ -8985,23 +6830,25 @@ OverlayPiece(piece, clip, outline,  dest)
 
   if (!useImages) {
     /* Draw solid rectangle which will be clipped to shape of piece */
-    XFillRectangle(xDisplay, dest, clip,
-                  0, 0, squareSize, squareSize);
+//    XFillRectangle(xDisplay, dest, clip,
+//                0, 0, squareSize, squareSize)
+;
     if (appData.monoMode)
       /* Also draw outline in contrasting color for black
         on black / white on white cases                */
-      XCopyPlane(xDisplay, *pieceToOutline(piece), dest, outline,
-                0, 0, squareSize, squareSize, 0, 0, 1);
+//      XCopyPlane(xDisplay, *pieceToOutline(piece), dest, outline,
+//              0, 0, squareSize, squareSize, 0, 0, 1)
+;
   } else {
     /* Copy the piece */
     if (White(piece))
       kind = 0;
     else
       kind = 2;
-    XCopyArea(xDisplay, xpmPieceBitmap[kind][piece],
-             dest, clip,
-             0, 0, squareSize, squareSize,
-             0, 0);
+//    XCopyArea(xDisplay, xpmPieceBitmap[kind][piece],
+//           dest, clip,
+//           0, 0, squareSize, squareSize,
+//           0, 0);
   }
 }
 
@@ -9021,8 +6868,8 @@ BeginAnimation(anim, piece, startColor, start)
   anim->prevFrame = *start;
 
   /* The piece will be drawn using its own bitmap as a matte   */
-  SelectGCMask(piece, &anim->pieceGC, &anim->outlineGC, &mask);
-  XSetClipMask(xDisplay, anim->pieceGC, mask);
+//  SelectGCMask(piece, &anim->pieceGC, &anim->outlineGC, &mask);
+//  XSetClipMask(xDisplay, anim->pieceGC, mask);
 }
 
 static void
@@ -9037,45 +6884,46 @@ AnimationFrame(anim, frame, piece)
   int       count, i;
 
   /* Save what we are about to draw into the new buffer */
-  XCopyArea(xDisplay, xBoardWindow, anim->newBuf, anim->blitGC,
-           frame->x, frame->y, squareSize, squareSize,
-           0, 0);
+//  XCopyArea(xDisplay, xBoardWindow, anim->newBuf, anim->blitGC,
+//         frame->x, frame->y, squareSize, squareSize,
+//         0, 0);
 
   /* Erase bits of the previous frame */
   if (Intersect(&anim->prevFrame, frame, squareSize, &overlap, &pt)) {
     /* Where the new frame overlapped the previous,
        the contents in newBuf are wrong. */
-    XCopyArea(xDisplay, anim->saveBuf, anim->newBuf, anim->blitGC,
-             overlap.x, overlap.y,
-             overlap.width, overlap.height,
-             pt.x, pt.y);
+//    XCopyArea(xDisplay, anim->saveBuf, anim->newBuf, anim->blitGC,
+//           overlap.x, overlap.y,
+//           overlap.width, overlap.height,
+//           pt.x, pt.y);
     /* Repaint the areas in the old that don't overlap new */
     CalcUpdateRects(&anim->prevFrame, frame, squareSize, updates, &count);
     for (i = 0; i < count; i++)
-      XCopyArea(xDisplay, anim->saveBuf, xBoardWindow, anim->blitGC,
-               updates[i].x - anim->prevFrame.x,
-               updates[i].y - anim->prevFrame.y,
-               updates[i].width, updates[i].height,
-               updates[i].x, updates[i].y);
+//      XCopyArea(xDisplay, anim->saveBuf, xBoardWindow, anim->blitGC,
+//             updates[i].x - anim->prevFrame.x,
+//             updates[i].y - anim->prevFrame.y,
+//             updates[i].width, updates[i].height,
+//             updates[i].x, updates[i].y)
+;
   } else {
     /* Easy when no overlap */
-    XCopyArea(xDisplay, anim->saveBuf, xBoardWindow, anim->blitGC,
-                 0, 0, squareSize, squareSize,
-                 anim->prevFrame.x, anim->prevFrame.y);
+//    XCopyArea(xDisplay, anim->saveBuf, xBoardWindow, anim->blitGC,
+//               0, 0, squareSize, squareSize,
+//               anim->prevFrame.x, anim->prevFrame.y);
   }
 
   /* Save this frame for next time round */
-  XCopyArea(xDisplay, anim->newBuf, anim->saveBuf, anim->blitGC,
-               0, 0, squareSize, squareSize,
-               0, 0);
+//  XCopyArea(xDisplay, anim->newBuf, anim->saveBuf, anim->blitGC,
+//             0, 0, squareSize, squareSize,
+//             0, 0);
   anim->prevFrame = *frame;
 
   /* Draw piece over original screen contents, not current,
      and copy entire rect. Wipes out overlapping piece images. */
   OverlayPiece(piece, anim->pieceGC, anim->outlineGC, anim->newBuf);
-  XCopyArea(xDisplay, anim->newBuf, xBoardWindow, anim->blitGC,
-               0, 0, squareSize, squareSize,
-               frame->x, frame->y);
+//  XCopyArea(xDisplay, anim->newBuf, xBoardWindow, anim->blitGC,
+//             0, 0, squareSize, squareSize,
+//             frame->x, frame->y);
 }
 
 static void
@@ -9093,15 +6941,16 @@ EndAnimation (anim, finish)
   if (Intersect(&anim->prevFrame, finish, squareSize, &overlap, &pt)) {
     CalcUpdateRects(&anim->prevFrame, finish, squareSize, updates, &count);
     for (i = 0; i < count; i++)
-      XCopyArea(xDisplay, anim->saveBuf, xBoardWindow, anim->blitGC,
-               updates[i].x - anim->prevFrame.x,
-               updates[i].y - anim->prevFrame.y,
-               updates[i].width, updates[i].height,
-               updates[i].x, updates[i].y);
+//      XCopyArea(xDisplay, anim->saveBuf, xBoardWindow, anim->blitGC,
+//             updates[i].x - anim->prevFrame.x,
+//             updates[i].y - anim->prevFrame.y,
+//             updates[i].width, updates[i].height,
+//             updates[i].x, updates[i].y)
+;
   } else {
-    XCopyArea(xDisplay, anim->saveBuf, xBoardWindow, anim->blitGC,
-               0, 0, squareSize, squareSize,
-               anim->prevFrame.x, anim->prevFrame.y);
+//    XCopyArea(xDisplay, anim->saveBuf, xBoardWindow, anim->blitGC,
+//             0, 0, squareSize, squareSize,
+//             anim->prevFrame.x, anim->prevFrame.y);
   }
 }
 
@@ -9142,8 +6991,8 @@ AnimateMove(board, fromX, fromY, toX, toY)
   if (!appData.animate || appData.blindfold)
     return;
 
-  if(board[toY][toX] == WhiteRook && board[fromY][fromX] == WhiteKing || 
-     board[toY][toX] == BlackRook && board[fromY][fromX] == BlackKing) 
+  if(board[toY][toX] == WhiteRook && board[fromY][fromX] == WhiteKing ||
+     board[toY][toX] == BlackRook && board[fromY][fromX] == BlackKing)
        return; // [HGM] FRC: no animtion of FRC castlings, as to-square is not true to-square
 
   if (fromY < 0 || fromX < 0 || toX < 0 || toY < 0) return;
@@ -9223,9 +7072,9 @@ DragPieceBegin(x, y)
           as seen by opponent) the move hasn't been made yet. */
            if(boardX == BOARD_RGHT+1 && PieceForSquare(boardX-1, boardY) > 1 ||
               boardX == BOARD_LEFT-2 && PieceForSquare(boardX+1, boardY) > 1)
-           XCopyArea(xDisplay, xBoardWindow, player.saveBuf, player.blitGC,
-                    corner.x, corner.y, squareSize, squareSize,
-                    0, 0); // [HGM] zh: unstack in stead of grab
+//           XCopyArea(xDisplay, xBoardWindow, player.saveBuf, player.blitGC,
+//                  corner.x, corner.y, squareSize, squareSize,
+//                  0, 0); // [HGM] zh: unstack in stead of grab
        damage[boardY][boardX] = True;
     } else {
        player.dragActive = False;
index 63be84e..5542d25 100644 (file)
@@ -27,6 +27,8 @@
 #include <ctype.h>
 #include <errno.h>
 #include <sys/types.h>
+#include <gtk/gtk.h>
+
 
 #if STDC_HEADERS
 # include <stdlib.h>
@@ -44,38 +46,6 @@ extern char *getenv();
 # include <unistd.h>
 #endif
 
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-#include <X11/Shell.h>
-#include <X11/cursorfont.h>
-#if USE_XAW3D
-#include <X11/Xaw3d/Dialog.h>
-#include <X11/Xaw3d/Form.h>
-#include <X11/Xaw3d/List.h>
-#include <X11/Xaw3d/Label.h>
-#include <X11/Xaw3d/SimpleMenu.h>
-#include <X11/Xaw3d/SmeBSB.h>
-#include <X11/Xaw3d/SmeLine.h>
-#include <X11/Xaw3d/Box.h>
-#include <X11/Xaw3d/MenuButton.h>
-#include <X11/Xaw3d/Text.h>
-#include <X11/Xaw3d/AsciiText.h>
-#include <X11/Xaw3d/Viewport.h>
-#else
-#include <X11/Xaw/Dialog.h>
-#include <X11/Xaw/Form.h>
-#include <X11/Xaw/List.h>
-#include <X11/Xaw/Label.h>
-#include <X11/Xaw/SimpleMenu.h>
-#include <X11/Xaw/SmeBSB.h>
-#include <X11/Xaw/SmeLine.h>
-#include <X11/Xaw/Box.h>
-#include <X11/Xaw/MenuButton.h>
-#include <X11/Xaw/Text.h>
-#include <X11/Xaw/AsciiText.h>
-#include <X11/Xaw/Viewport.h>
-#endif
-
 #include "common.h"
 #include "frontend.h"
 #include "backend.h"
@@ -83,6 +53,10 @@ extern char *getenv();
 #include "xedittags.h"
 #include "gettext.h"
 
+extern GtkWidget               *GUI_EditTags;
+extern GtkWidget               *GUI_EditTagsTextArea;
+
+
 #ifdef ENABLE_NLS
 # define  _(s) gettext (s)
 # define N_(s) gettext_noop (s)
@@ -91,332 +65,92 @@ extern char *getenv();
 # define N_(s)  s
 #endif
 
-extern Widget formWidget, shellWidget, boardWidget, menuBarWidget;
-extern Display *xDisplay;
-extern int squareSize;
-extern Pixmap xMarkPixmap;
-extern char *layoutName;
-
-Position tagsX = -1, tagsY = -1;
-int tagsUp = False, editTagsUp = False;
-Widget tagsShell, editTagsShell;
-
-static Arg layoutArgs[] = {
-    { XtNborderWidth, 0 },
-    { XtNdefaultDistance, 0 }
-};
-
-void TagsCallback(w, client_data, call_data)
-     Widget w;
-     XtPointer client_data, call_data;
-{
-    String name;
-    Arg args[16];
-    int j;
-
-    j = 0;
-    XtSetArg(args[j], XtNlabel, &name);  j++;
-    XtGetValues(w, args, j);
-
-    if (strcmp(name, _("close")) == 0) {
-       TagsPopDown();
-    } else if (strcmp(name, _("edit")) == 0) {
-       TagsPopDown();
-       EditTagsEvent();
-    }
-}
-
-
-void EditTagsCallback(w, client_data, call_data)
-     Widget w;
-     XtPointer client_data, call_data;
+void 
+TagsPopDown()
 {
-    String name, val;
-    Arg args[16];
-    int j;
-    Widget textw;
-
-    j = 0;
-    XtSetArg(args[j], XtNlabel, &name);  j++;
-    XtGetValues(w, args, j);
-
-    if (strcmp(name, _("ok")) == 0) {
-       textw = XtNameToWidget(editTagsShell, "*form.text");
-       j = 0;
-       XtSetArg(args[j], XtNstring, &val); j++;
-       XtGetValues(textw, args, j);
-       ReplaceTags(val, &gameInfo);
-       TagsPopDown();
-    } else if (strcmp(name, _("cancel")) == 0) {
-       TagsPopDown();
-    } else if (strcmp(name, _("clear")) == 0) {
-       textw = XtNameToWidget(editTagsShell, "*form.text");
-       XtCallActionProc(textw, "select-all", NULL, NULL, 0);
-       XtCallActionProc(textw, "kill-selection", NULL, NULL, 0);
-    }
-}
-
-Widget TagsCreate(name, text, msg, mutable, callback)
-     char *name, *text, *msg;
-     int /*Boolean*/ mutable;
-     XtCallbackProc callback;
-{
-    Arg args[16];
-    Widget shell, form, textw, msgw, layout;
-    Widget b_ok, b_cancel, b_close, b_edit, b;
-    Dimension bw_width, pw_width;
-    Dimension pw_height;
-    int j, xx, yy;
-    Window junk;
-
-    j = 0;
-    XtSetArg(args[j], XtNwidth, &bw_width);  j++;
-    XtGetValues(boardWidget, args, j);
-
-    j = 0;
-    XtSetArg(args[j], XtNresizable, True);  j++;
-#if TOPLEVEL
-    shell =
-      XtCreatePopupShell(name, topLevelShellWidgetClass,
-                        shellWidget, args, j);
-#else
-    shell =
-      XtCreatePopupShell(name, transientShellWidgetClass,
-                        shellWidget, args, j);
-#endif
-    layout =
-      XtCreateManagedWidget(layoutName, formWidgetClass, shell,
-                           layoutArgs, XtNumber(layoutArgs));
-    j = 0;
-    XtSetArg(args[j], XtNborderWidth, 0); j++;
-    form =
-      XtCreateManagedWidget("form", formWidgetClass, layout, args, j);
-
-    j = 0;
-    if (mutable) {
-       XtSetArg(args[j], XtNeditType, XawtextEdit);  j++;
-       XtSetArg(args[j], XtNuseStringInPlace, False);  j++;
-    }
-    XtSetArg(args[j], XtNstring, text);  j++;
-    XtSetArg(args[j], XtNtop, XtChainTop);  j++;
-    XtSetArg(args[j], XtNbottom, XtChainBottom);  j++;
-    XtSetArg(args[j], XtNleft, XtChainLeft);  j++;
-    XtSetArg(args[j], XtNright, XtRubber);  j++;
-    XtSetArg(args[j], XtNresizable, True);  j++;
-    XtSetArg(args[j], XtNwidth, bw_width/2);  j++;
-    XtSetArg(args[j], XtNheight, bw_width/3);  j++;
-    /* !!Work around an apparent bug in XFree86 4.0.1 (X11R6.4.3) */
-    XtSetArg(args[j], XtNscrollVertical, XawtextScrollAlways);  j++;
-    XtSetArg(args[j], XtNautoFill, False);  j++;
-    textw =
-      XtCreateManagedWidget("text", asciiTextWidgetClass, form, args, j);
-
-    if (cmailMsgLoaded && !mutable) {
-       j = 0;
-       XtSetArg(args[j], XtNfromVert, textw);  j++;
-       XtSetArg(args[j], XtNtop, XtChainBottom); j++;
-       XtSetArg(args[j], XtNbottom, XtChainBottom); j++;
-       XtSetArg(args[j], XtNleft, XtChainLeft); j++;
-       XtSetArg(args[j], XtNright, XtChainRight); j++;
-       XtSetArg(args[j], XtNborderWidth, 0); j++;
-       XtSetArg(args[j], XtNjustify, XtJustifyLeft); j++;
-       XtSetArg(args[j], XtNlabel, msg); j++;
-       msgw =
-         XtCreateManagedWidget("msg", labelWidgetClass, form, args, j);
-    } else {
-       msgw = textw;
-    }
-    if (mutable) {
-       j = 0;
-       XtSetArg(args[j], XtNfromVert, msgw);  j++;
-       XtSetArg(args[j], XtNtop, XtChainBottom); j++;
-       XtSetArg(args[j], XtNbottom, XtChainBottom); j++;
-       XtSetArg(args[j], XtNleft, XtChainLeft); j++;
-       XtSetArg(args[j], XtNright, XtChainLeft); j++;
-       b_ok = b =
-         XtCreateManagedWidget(_("ok"), commandWidgetClass, form, args, j);
-       XtAddCallback(b_ok, XtNcallback, callback, (XtPointer) 0);
-
-       j = 0;
-       XtSetArg(args[j], XtNfromVert, msgw);  j++;
-       XtSetArg(args[j], XtNfromHoriz, b);  j++;
-       XtSetArg(args[j], XtNtop, XtChainBottom); j++;
-       XtSetArg(args[j], XtNbottom, XtChainBottom); j++;
-       XtSetArg(args[j], XtNleft, XtChainLeft); j++;
-       XtSetArg(args[j], XtNright, XtChainLeft); j++;
-       b_cancel = b =
-         XtCreateManagedWidget(_("cancel"), commandWidgetClass, form, args, j);
-       XtAddCallback(b_cancel, XtNcallback, callback, (XtPointer) 0);
-
-    } else {
-       j = 0;
-       XtSetArg(args[j], XtNfromVert, msgw);  j++;
-       XtSetArg(args[j], XtNtop, XtChainBottom); j++;
-       XtSetArg(args[j], XtNbottom, XtChainBottom); j++;
-       XtSetArg(args[j], XtNleft, XtChainLeft); j++;
-       XtSetArg(args[j], XtNright, XtChainLeft); j++;
-       b_close = b =
-         XtCreateManagedWidget(_("close"), commandWidgetClass, form, args, j);
-       XtAddCallback(b_close, XtNcallback, callback, (XtPointer) 0);
-
-       j = 0;
-       XtSetArg(args[j], XtNfromVert, msgw);  j++;
-       XtSetArg(args[j], XtNfromHoriz, b);  j++;
-       XtSetArg(args[j], XtNtop, XtChainBottom); j++;
-       XtSetArg(args[j], XtNbottom, XtChainBottom); j++;
-       XtSetArg(args[j], XtNleft, XtChainLeft); j++;
-       XtSetArg(args[j], XtNright, XtChainLeft); j++;
-       b_edit = b =
-         XtCreateManagedWidget(_("edit"), commandWidgetClass, form, args, j);
-       XtAddCallback(b_edit, XtNcallback, callback, (XtPointer) 0);
-    }
-
-    XtRealizeWidget(shell);
-    CatchDeleteWindow(shell, "TagsPopDown");
-
-    if (tagsX == -1) {
-       j = 0;
-       XtSetArg(args[j], XtNwidth, &bw_width);  j++;
-       XtGetValues(boardWidget, args, j);
-       j = 0;
-       XtSetArg(args[j], XtNwidth, &pw_width);  j++;
-       XtSetArg(args[j], XtNheight, &pw_height);  j++;
-       XtGetValues(shell, args, j);
-
-#ifdef NOTDEF
-       /* This code seems to tickle an X bug if it is executed too soon
-          after xboard starts up.  The coordinates get transformed as if
-          the main window was positioned at (0, 0).
-          */
-       XtTranslateCoords(boardWidget, (bw_width - pw_width) / 2,
-                         0 - pw_height + squareSize / 3, &x, &y);
-#else
-       XTranslateCoordinates(xDisplay, XtWindow(boardWidget),
-                             RootWindowOfScreen(XtScreen(boardWidget)),
-                             (bw_width - pw_width) / 2,
-                             0 - pw_height + squareSize / 3, &xx, &yy, &junk);
-       tagsX = xx;
-       tagsY = yy;
-#endif
-       if (tagsY < 0) tagsY = 0; /*avoid positioning top offscreen*/
-    }
-    j = 0;
-    XtSetArg(args[j], XtNx, tagsX - appData.borderXoffset);  j++;
-    XtSetArg(args[j], XtNy, tagsY - appData.borderYoffset);  j++;
-    XtSetValues(shell, args, j);
-    XtSetKeyboardFocus(shell, textw);
-
-    return shell;
+  return;
 }
 
-
-void TagsPopUp(tags, msg)
-     char *tags, *msg;
+void 
+TagsPopUp(char *tags, char *msg)
 {
-    Arg args[16];
-    int j;
-    Widget textw, msgw;
-
-    if (editTagsUp) TagsPopDown();
-    if (tagsShell == NULL) {
-       tagsShell =
-         TagsCreate(_("Tags"), tags, msg, False, TagsCallback);
-    } else {
-       textw = XtNameToWidget(tagsShell, "*form.text");
-       j = 0;
-       XtSetArg(args[j], XtNstring, tags); j++;
-       XtSetValues(textw, args, j);
-       j = 0;
-       XtSetArg(args[j], XtNiconName, (XtArgVal) "Tags");  j++;
-       XtSetArg(args[j], XtNtitle, (XtArgVal) _("Tags"));  j++;
-       XtSetValues(tagsShell, args, j);
-       msgw = XtNameToWidget(tagsShell, "*form.msg");
-       if (msgw) {
-           j = 0;
-           XtSetArg(args[j], XtNlabel, msg); j++;
-           XtSetValues(msgw, args, j);
-       }
-    }
-
-    XtPopup(tagsShell, XtGrabNone);
-    XSync(xDisplay, False);
-
-    tagsUp = True;
-    j = 0;
-    XtSetArg(args[j], XtNleftBitmap, None); j++;
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Edit Tags"),
-               args, j);
+  EditTagsPopUp(tags);
+  return;
 }
 
 
-void EditTagsPopUp(tags)
+//void EditTagsCallback(w, client_data, call_data)
+//     Widget w;
+//     XtPointer client_data, call_data;
+//{
+//    String name, val;
+//    Arg args[16];
+//    int j;
+//    Widget textw;
+//
+//    j = 0;
+//    XtSetArg(args[j], XtNlabel, &name);  j++;
+//    XtGetValues(w, args, j);
+//    
+//
+//    if (strcmp(name, _("ok")) == 0) {
+//    /* ok: get values, update, close */
+//     textw = XtNameToWidget(editTagsShell, "*form.text");
+//     j = 0;
+//     XtSetArg(args[j], XtNstring, &val); j++;
+//     XtGetValues(textw, args, j);
+//     ReplaceTags(val, &gameInfo);
+//     TagsPopDown();
+//    } else if (strcmp(name, _("cancel")) == 0) {
+//      /* close */
+//     TagsPopDown();
+//    } else if (strcmp(name, _("clear")) == 0) {
+//      /* clear all */
+//     textw = XtNameToWidget(editTagsShell, "*form.text");
+//     XtCallActionProc(textw, "select-all", NULL, NULL, 0);
+//     XtCallActionProc(textw, "kill-selection", NULL, NULL, 0);
+//    }
+//}
+
+
+void 
+EditTagsPopUp(tags)
      char *tags;
 {
-    Widget textw;
-    Arg args[16];
-    int j;
-
-    if (tagsUp) TagsPopDown();
-    if (editTagsShell == NULL) {
-       editTagsShell =
-         TagsCreate(_("Edit tags"), tags, NULL, True, EditTagsCallback); 
-    } else {
-       textw = XtNameToWidget(editTagsShell, "*form.text");
-       j = 0;
-       XtSetArg(args[j], XtNstring, tags); j++;
-       XtSetValues(textw, args, j);
-       j = 0;
-       XtSetArg(args[j], XtNiconName, (XtArgVal) "Edit Tags");  j++;
-       XtSetArg(args[j], XtNtitle, (XtArgVal) _("Edit Tags"));  j++;
-       XtSetValues(editTagsShell, args, j);
-    }
-
-    XtPopup(editTagsShell, XtGrabNone);
-
-    editTagsUp = True;
-    j = 0;
-    XtSetArg(args[j], XtNleftBitmap, xMarkPixmap); j++;
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Edit Tags"),
-               args, j);
+  GtkWidget *label;  
+  
+  /* add the text to the dialog */
+  
+  label = gtk_label_new (tags);
+
+  /* remove old tags that we already added */
+  gtk_container_foreach(GTK_CONTAINER (GUI_EditTagsTextArea),G_CALLBACK (gtk_widget_destroy),NULL);
+  
+  /* TODO replace this with a version where you can edit and a callback for the edit button that saves the new tags*/
+  gtk_container_add (GTK_CONTAINER (GUI_EditTagsTextArea), label);
+  
+  /* realize widget */
+  gtk_widget_show_all (GUI_EditTags);
+
+  return;
 }
 
-void TagsPopDown()
+void
+EditTagsProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
 {
-    Arg args[16];
-    int j;
-    Widget w;
-
-    if (tagsUp) {
-       w = tagsShell;
-    } else if (editTagsUp) {
-       w = editTagsShell;
-    } else {
-       return;
-    }
-    j = 0;
-    XtSetArg(args[j], XtNx, &tagsX); j++;
-    XtSetArg(args[j], XtNy, &tagsY); j++;
-    XtGetValues(w, args, j);
-    XtPopdown(w);
-    XSync(xDisplay, False);
-    tagsUp = editTagsUp = False;
-    j = 0;
-    XtSetArg(args[j], XtNleftBitmap, None); j++;
-    XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Edit Tags"),
-               args, j);
+  /* always call EditTagsEvent, which calls the function to popup the window */
+  EditTagsEvent();
+  return;
 }
 
 void
-EditTagsProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+EditTagsHideProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
 {
-    if (tagsUp) TagsPopDown();
-    if (editTagsUp) {
-       TagsPopDown();
-    } else {
-       EditTagsEvent();
-    }
+  /* hide everything */
+  gtk_widget_hide_all(GUI_EditTags);
+  return;
 }
index e777067..e27da9e 100644 (file)
@@ -24,7 +24,7 @@
 #ifndef _XEDITTAGS_H
 #define _XEDITTAGS_H 1
 
-void EditTagsProc P((Widget w, XEvent *event,
-                    String *prms, Cardinal *nprms));
+void EditTagsProc P((GtkObject *object, gpointer user_data));
+void EditTagsHideProc P((GtkObject *object, gpointer user_data));
 
 #endif
index 2df13d3..2096f2e 100644 (file)
@@ -144,7 +144,7 @@ extern int opponentKibitzes;
 
 /* Imports from winboard.c */
 //extern HWND engineOutputDialog;
-extern Arg layoutArgs[2], formArgs[2], messageArgs[4];
+extern Arg layoutArgs[2], formArgs[2];
 
 //extern WindowPlacement wpEngineOutput;
 
index c2ac392..1a29626 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "config.h"
 
+#include <gtk/gtk.h>
 #include <stdio.h>
 #include <ctype.h>
 #include <errno.h>
@@ -43,24 +44,6 @@ extern char *getenv();
 # include <unistd.h>
 #endif
 
-#include <X11/Intrinsic.h>
-#include <X11/StringDefs.h>
-#include <X11/Shell.h>
-#include <X11/Xaw/Dialog.h>
-#include <X11/Xaw/Form.h>
-#include <X11/Xaw/List.h>
-#include <X11/Xaw/Label.h>
-#include <X11/Xaw/SimpleMenu.h>
-#include <X11/Xaw/SmeBSB.h>
-#include <X11/Xaw/SmeLine.h>
-#include <X11/Xaw/Box.h>
-#include <X11/Xaw/Paned.h>
-#include <X11/Xaw/MenuButton.h>
-#include <X11/cursorfont.h>
-#include <X11/Xaw/Text.h>
-#include <X11/Xaw/AsciiText.h>
-#include <X11/Xaw/Viewport.h>
-
 #include "common.h"
 #include "frontend.h"
 #include "backend.h"
@@ -76,51 +59,24 @@ extern char *getenv();
 # define N_(s)  s
 #endif
 
-#define _LL_ 100
-
-extern Widget formWidget, shellWidget, boardWidget, menuBarWidget;
-extern Display *xDisplay;
-extern int squareSize;
-extern Pixmap xMarkPixmap;
-extern char *layoutName;
-
-struct History{
-  String *Nr,*white,*black;
-  int     aNr;  /* space actually alocated */
-  Widget mvn,mvw,mvb,vbox,viewport,sh;
-  char Up;
-};
+extern GtkWidget               *GUI_History;
+extern GtkListStore            *LIST_MoveHistory;
 
-struct History *hist=0;
 String dots=" ... ";
-Position gameHistoryX, gameHistoryY;
 
 void
-HistoryPopDown(w, client_data, call_data)
-     Widget w;
-     XtPointer client_data, call_data;
+HistoryPopDown(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
 {
-  Arg args[16];
-  int j;
-  if(hist) {
-    // [HGM] remember old position
-    j = 0;
-    XtSetArg(args[j], XtNx, &gameHistoryX);  j++;
-    XtSetArg(args[j], XtNy, &gameHistoryY);  j++;
-    XtGetValues(hist->sh, args, j);
-
-    XtPopdown(hist->sh);
-    hist->Up=False;
-  }
-  j=0;
-  XtSetArg(args[j], XtNleftBitmap, None); j++;
-  XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Show Move History"),
-               args, j);
+  gtk_widget_hide (GUI_History);
+  return;
 }
 
 void HistoryMoveProc(Widget w, XtPointer closure, XtPointer call_data)
 {
     int to;
+    /*
     XawListReturnStruct *R = (XawListReturnStruct *) call_data;
     if (w == hist->mvn || w == hist->mvw) {
       to=2*R->list_index-1;
@@ -130,319 +86,115 @@ void HistoryMoveProc(Widget w, XtPointer closure, XtPointer call_data)
       to=2*R->list_index;
       ToNrEvent(to);
     }
+    */
 }
 
-void HistoryAlloc(int len){
-  int i;
-  if(hist){
-    free(hist->Nr[0]);free(hist->white[0]);free(hist->black[0]);
-    free(hist->Nr);free(hist->white);free(hist->black);
-  }
-  else{
-    hist=(struct History*)malloc(sizeof(struct History));
-  }
-    hist->aNr=len;
-    hist->Nr=(String*)malloc(hist->aNr*sizeof(String*));
-    hist->white=(String*)malloc(hist->aNr*sizeof(String*));
-    hist->black=(String*)malloc(hist->aNr*sizeof(String*));
-
-    hist->Nr[0]=(String)malloc(hist->aNr*6);
-    hist->white[0]=(String)malloc(hist->aNr*MOVE_LEN);
-    hist->black[0]=(String)malloc(hist->aNr*MOVE_LEN);
 
-      sprintf(hist->Nr[0],"    ");
-      sprintf(hist->white[0],_("White "));
-      sprintf(hist->black[0],_("Black "));
-    for(i=1;i<hist->aNr;i++){
-      hist->Nr[i]= hist->Nr[i-1]+6;
-      hist->white[i]= hist->white[i-1]+MOVE_LEN;
-      hist->black[i]= hist->black[i-1]+MOVE_LEN;
-      sprintf(hist->Nr[i],"%i.",i);
-      sprintf(hist->white[i],"-----");
-      sprintf(hist->black[i],"-----");
-     }
-}
-
-
-/* Find empty space inside vbox form widget and redistribute it amongst
-   the list widgets inside it. */
-/* This version sort of works */
-void
-HistoryFill()
+void HistorySet(char movelist[][2*MOVE_LEN],int first,int last,int current)
 {
-  Dimension w, bw;
-  long extra;
-  Position x, x1, x2;
-  int j, dd;
-  Arg args[16];
-
-  j = 0;
-  XtSetArg(args[j], XtNx, &x);  j++;
-  XtSetArg(args[j], XtNwidth, &w);  j++;
-  XtSetArg(args[j], XtNborderWidth, &bw);  j++;
-  XtGetValues(hist->mvb, args, j);
-  x1 = x + w + 2*bw;
-
-  j = 0;
-  XtSetArg(args[j], XtNwidth, &w);  j++;
-  XtSetArg(args[j], XtNdefaultDistance, &dd);  j++;
-  XtGetValues(hist->vbox, args, j);
-  x2 = w - dd;
+  int i,b,m;
+  char movewhite[2*MOVE_LEN],moveblack[2*MOVE_LEN],move[2*MOVE_LEN];
+  GtkTreeIter iter;
 
-  extra = x2 - x1;
-  if (extra < 0) {
-    extra = -((-extra)/2);
-  } else {
-    extra = extra/2;
-  }
+  /* TODO need to add highlights for current move */
+  /* TODO need to add navigation by keyboard or mouse (double click on move) */
 
-  j = 0;
-  XtSetArg(args[j], XtNwidth, &w);  j++;
-  XtGetValues(hist->mvw, args, j);
-  w += extra;
-  j = 0;
-  XtSetArg(args[j], XtNwidth, w);  j++;
-  XtSetValues(hist->mvw, args, j);
+  /* first clear everything, do we need this? */
+  gtk_list_store_clear(LIST_MoveHistory);
 
-  j = 0;
-  XtSetArg(args[j], XtNwidth, &w);  j++;
-  XtGetValues(hist->mvb, args, j);
-  w += extra;
-  j = 0;
-  XtSetArg(args[j], XtNwidth, w);  j++;
-  XtSetValues(hist->mvb, args, j);
-}
+  /* copy move list into history window */
 
-void HistorySet(char movelist[][2*MOVE_LEN],int first,int last,int current){
-  int i,b,m;
-  if(hist){
-    if(last >= hist->aNr) HistoryAlloc(last+_LL_);
-    for(i=0;i<last;i++) {
-      if((i%2)==0) {
-       if(movelist[i][0]) {
+  /* go through all moves */
+  for(i=0;i<last;i++) 
+    {
+      /* test if there is a move */
+      if(movelist[i][0]) 
+       {
+         /* only copy everything before a  ' ' */
          char* p = strchr(movelist[i], ' ');
-         if (p) {
-           strncpy(hist->white[i/2+1], movelist[i], p-movelist[i]);
-           hist->white[i/2+1][p-movelist[i]] = NULLCHAR;
-         } else {
-           strcpy(hist->white[i/2+1],movelist[i]);
-         }
-       } else {
-         strcpy(hist->white[i/2+1],dots);
-       }
-      } else {
-       if(movelist[i][0]) {
-         char* p = strchr(movelist[i], ' ');
-         if (p) {
-           strncpy(hist->black[i/2+1], movelist[i], p-movelist[i]);
-           hist->black[i/2+1][p-movelist[i]] = NULLCHAR;
-         } else {
-           strcpy(hist->black[i/2+1],movelist[i]);
-         }
-       } else {
-         strcpy(hist->black[i/2+1],"");
-       }
-      }
-    }
-    strcpy(hist->black[last/2+1],"");
-    b=first/2;
-    m=(last+3)/2-b;
-    XawFormDoLayout(hist->vbox, False);
-    XawListChange(hist->mvn,hist->Nr+b,m,0,True);
-    XawListChange(hist->mvw,hist->white+b,m,0,True);
-    XawListChange(hist->mvb,hist->black+b,m,0,True);
-    HistoryFill();
-    XawFormDoLayout(hist->vbox, True);
-    if(current<0){
-      XawListUnhighlight(hist->mvw);
-      XawListUnhighlight(hist->mvb);
+         if (p) 
+           {
+             strncpy(move, movelist[i], p-movelist[i]);
+             move[p-movelist[i]] = NULLCHAR;
+           } 
+         else 
+           {
+             strcpy(move,movelist[i]);
+           }
+       } 
+      else
+       strcpy(move,dots);
+      
+      if((i%2)==0) 
+       {
+         /* white move */
+         strcpy(movewhite,move);
+       }
+      else
+       {
+         /* black move */
+         strcpy(moveblack,move);
+
+         /* save move */
+         gtk_list_store_append (LIST_MoveHistory, &iter);
+         gtk_list_store_set (LIST_MoveHistory, &iter,
+                             0, i,
+                             1, movewhite,
+                             2, moveblack,
+                             -1);
+
+         strcpy(movewhite,"");
+         strcpy(moveblack,"");
+       };
     }
-    else if((current%2)==0){
-      XawListHighlight(hist->mvw, current/2+1);
-      XawListUnhighlight(hist->mvb);
-    }
-    else{
-      XawListUnhighlight(hist->mvw);
-      if(current) XawListHighlight(hist->mvb, current/2+1);
-      else XawListUnhighlight(hist->mvb);
-    }
-  }
+  /* check if ther is a white move left */
+  if(movewhite[0])
+    {
+      i++;
+      strcpy(moveblack,"");
+      /* save move */
+      gtk_list_store_append (LIST_MoveHistory, &iter);
+      gtk_list_store_set (LIST_MoveHistory, &iter,
+                         0, i,
+                         1, movewhite,
+                         2, moveblack,
+                         -1);
+    };
+  
+  return;
 }
 
-Widget HistoryCreate()
+void HistoryCreate()
 {
-    Arg args[16];
-    int i,j;
-
-    Widget layout,form,b_close;
     String trstr=
              "<Key>Up: BackwardProc() \n \
              <Key>Left: BackwardProc() \n \
              <Key>Down: ForwardProc() \n \
              <Key>Right: ForwardProc() \n";
-    /*--- allocate memory for move-strings ---*/
-    HistoryAlloc(_LL_);
 
-    /*-------- create the widgets ---------------*/
-    j = 0;
-    XtSetArg(args[j], XtNresizable, True);  j++;
-    XtSetArg(args[j], XtNallowShellResize, True);  j++;
-#if TOPLEVEL
-    hist->sh =
-      XtCreatePopupShell(_("Move list"), topLevelShellWidgetClass,
-                        shellWidget, args, j);
-#else
-    hist->sh =
-      XtCreatePopupShell(_("Move list"), transientShellWidgetClass,
-                        shellWidget, args, j);
-#endif
-    j = 0;
-    XtSetArg(args[j], XtNborderWidth, 0); j++;
-    XtSetArg(args[j], XtNdefaultDistance, 0);  j++;
-      layout =
-      XtCreateManagedWidget(layoutName, formWidgetClass, hist->sh,
-                           args, j);
-
-    j = 0;
-    XtSetArg(args[j], XtNborderWidth, 0); j++;
-    XtSetArg(args[j], XtNresizable, True);  j++;
-
-    form =
-      XtCreateManagedWidget("form", formWidgetClass, layout, args, j);
-     j=0;
-
-    j = 0;
-
-    XtSetArg(args[j], XtNtop, XtChainTop);  j++;
-    XtSetArg(args[j], XtNbottom, XtChainBottom);  j++;
-    XtSetArg(args[j], XtNleft, XtChainLeft);  j++;
-    XtSetArg(args[j], XtNright, XtChainRight);  j++;
-
-    XtSetArg(args[j], XtNborderWidth, 1); j++;
-    XtSetArg(args[j], XtNresizable, False);  j++;
-    XtSetArg(args[j], XtNallowVert, True); j++;
-    XtSetArg(args[j], XtNallowHoriz, True);  j++;
-    XtSetArg(args[j], XtNforceBars, False); j++;
-    XtSetArg(args[j], XtNheight, 280); j++;
-    hist->viewport =
-      XtCreateManagedWidget("viewport", viewportWidgetClass,
-                           form, args, j);
-    j=0;
-    XtSetArg(args[j], XtNborderWidth, 0); j++;
-    XtSetArg(args[j], XtNorientation,XtorientHorizontal);j++;
-    hist->vbox =
-      XtCreateManagedWidget("vbox", formWidgetClass, hist->viewport, args, j);
-
-    j=0;
-    XtSetArg(args[j], XtNtop, XtChainTop);  j++;
-    XtSetArg(args[j], XtNbottom, XtChainTop);  j++;
-    XtSetArg(args[j], XtNleft, XtChainLeft);  j++;
-    XtSetArg(args[j], XtNright, XtChainLeft);  j++;
-
-    XtSetArg(args[j], XtNdefaultColumns, 1);  j++;
-    XtSetArg(args[j], XtNforceColumns, True);  j++;
-    XtSetArg(args[j], XtNverticalList, True);  j++;
-    XtSetArg(args[j], XtNborderWidth, 0); j++;
-    XtSetArg(args[j], XtNresizable,True);j++;
-    XtSetArg(args[j], XtNleft, XtChainLeft);  j++;
-    hist->mvn = XtCreateManagedWidget("movesn", listWidgetClass,
-                                     hist->vbox, args, j);
-    XtAddCallback(hist->mvn, XtNcallback, HistoryMoveProc, (XtPointer) hist);
-
-    j=0;
-    XtSetArg(args[j], XtNtop, XtChainTop);  j++;
-    XtSetArg(args[j], XtNbottom, XtChainTop);  j++;
-    XtSetArg(args[j], XtNleft, XtChainLeft);  j++;
-    XtSetArg(args[j], XtNright, XtRubber);  j++;
-
-    XtSetArg(args[j], XtNdefaultColumns, 1);  j++;
-    XtSetArg(args[j], XtNforceColumns, True);  j++;
-    XtSetArg(args[j], XtNverticalList, True);  j++;
-    XtSetArg(args[j], XtNborderWidth, 0); j++;
-    XtSetArg(args[j], XtNresizable,True);j++;
-    XtSetArg(args[j], XtNfromHoriz, hist->mvn);  j++;
-    hist->mvw = XtCreateManagedWidget("movesw", listWidgetClass,
-                                     hist->vbox, args, j);
-    XtAddCallback(hist->mvw, XtNcallback, HistoryMoveProc, (XtPointer) hist);
-
-    j=0;
-    XtSetArg(args[j], XtNtop, XtChainTop);  j++;
-    XtSetArg(args[j], XtNbottom, XtChainTop);  j++;
-    XtSetArg(args[j], XtNleft, XtRubber);  j++;
-    XtSetArg(args[j], XtNright,  XtRubber);  j++;
-
-    XtSetArg(args[j], XtNdefaultColumns, 1);  j++;
-    XtSetArg(args[j], XtNforceColumns, True);  j++;
-    XtSetArg(args[j], XtNverticalList, True);  j++;
-    XtSetArg(args[j], XtNborderWidth, 0); j++;
-    XtSetArg(args[j], XtNresizable,True);j++;
-    XtSetArg(args[j], XtNfromHoriz, hist->mvw);  j++;
-    hist->mvb = XtCreateManagedWidget("movesb", listWidgetClass,
-                                     hist->vbox, args, j);
-    XtAddCallback(hist->mvb, XtNcallback, HistoryMoveProc, (XtPointer) hist);
-
-    j=0;
-    XtSetArg(args[j], XtNbottom, XtChainBottom);  j++;
-    XtSetArg(args[j], XtNtop, XtChainBottom);  j++;
-    XtSetArg(args[j], XtNleft, XtChainLeft);  j++;
-    XtSetArg(args[j], XtNright, XtChainLeft);  j++;
-    XtSetArg(args[j], XtNfromVert, hist->viewport);  j++;
-    b_close= XtCreateManagedWidget(_("Close"), commandWidgetClass,
-                                  form, args, j);
-    XtAddCallback(b_close, XtNcallback, HistoryPopDown, (XtPointer) 0);
-
-    XtAugmentTranslations(hist->sh,XtParseTranslationTable (trstr));
-
-    XtRealizeWidget(hist->sh);
-    CatchDeleteWindow(hist->sh, "HistoryPopDown");
-
-    for(i=1;i<hist->aNr;i++){
-      strcpy(hist->white[i],dots);
-      strcpy(hist->black[i],"");
-     }
-
-    return hist->sh;
+    return;
 }
 
 void
 HistoryPopUp()
 {
-  Arg args[16];
-  int j;
-
-  if(!hist) HistoryCreate();
-
-  XtPopup(hist->sh, XtGrabNone);
+  //  if(!hist) HistoryCreate();
 
-  // [HGM] restore old position
-  j = 0;
-  XtSetArg(args[j], XtNx, gameHistoryX);  j++;
-  XtSetArg(args[j], XtNy, gameHistoryY);  j++;
-  XtSetValues(hist->sh, args, j);
-
-  j=0;
-  XtSetArg(args[j], XtNleftBitmap, xMarkPixmap); j++;
-  XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Show Move History"),
-               args, j);
-  hist->Up=True;
+  gtk_widget_show (GUI_History);
+  
+  return;
 }
 
 
 void
-HistoryShowProc(w, event, prms, nprms)
-     Widget w;
-     XEvent *event;
-     String *prms;
-     Cardinal *nprms;
+HistoryShowProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
 {
-  if (!hist) {
-    HistoryCreate();
-    HistoryPopUp();
-  } else if (hist->Up) {
-    HistoryPopDown(0,0,0);
-  } else {
-    HistoryPopUp();
-  }
-  ToNrEvent(currentMove);
+  HistoryCreate();
+  HistoryPopUp();
+  //TODO:  ToNrEvent(currentMove);
+
+  return;
 }
 
index 427cd7d..8e8c5d7 100644 (file)
 #ifndef _XHISTL_H
 #define _XHISTL_H 1
 
-void HistoryShowProc P((Widget w, XEvent *event,
-                       String *prms, Cardinal *nprms));
-void HistoryPopDown P((Widget w, XtPointer client_data,
-                      XtPointer call_data));
+void HistoryShowProc  P((GtkObject *object, gpointer user_data));
+
+void HistoryPopDown   P((GtkObject *object, gpointer user_data));
 
 #endif /* _XHISTL_H */