Suppress popup for fatal error after tellusererror
[xboard.git] / backend.c
index 38c3533..91f6e8d 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -450,7 +450,7 @@ int adjudicateLossPlies = 6;
 char white_holding[64], black_holding[64];
 TimeMark lastNodeCountTime;
 long lastNodeCount=0;
-int shiftKey; // [HGM] set by mouse handler
+int shiftKey, controlKey; // [HGM] set by mouse handler
 
 int have_sent_ICS_logon = 0;
 int movesPerSession;
@@ -920,7 +920,7 @@ Load (ChessProgramState *cps, int i)
     while(q = strchr(p, SLASH)) p = q+1;
     if(*p== NULLCHAR) { DisplayError(_("You did not specify the engine executable"), 0); return; }
     if(engineDir[0] != NULLCHAR) {
-       ASSIGN(appData.directory[i], engineDir);
+       ASSIGN(appData.directory[i], engineDir); p = engineName;
     } else if(p != engineName) { // derive directory from engine path, when not given
        p[-1] = 0;
        ASSIGN(appData.directory[i], engineName);
@@ -6664,7 +6664,7 @@ UserMoveEvent(int fromX, int fromY, int toX, int toY, int promoChar)
                    if(boards[0][fromY][BOARD_WIDTH-2] == 0)  boards[0][fromY][BOARD_WIDTH-1] = EmptySquare;
                }
            } else
-           boards[0][fromY][fromX] = EmptySquare;
+           boards[0][fromY][fromX] = gatingPiece;
            DrawPosition(FALSE, boards[currentMove]);
            return;
        }
@@ -7060,6 +7060,7 @@ LeftClick (ClickType clickType, int xPix, int yPix)
            if (OKToStartUserMove(fromX, fromY)) {
                second = 0;
                MarkTargetSquares(0);
+               if(gameMode == EditPosition && controlKey) gatingPiece = boards[currentMove][fromY][fromX];
                DragPieceBegin(xPix, yPix, FALSE); dragging = 1;
                if(appData.sweepSelect && CanPromote(piece = boards[currentMove][fromY][fromX], fromY)) {
                    promoSweep = defaultPromoChoice;
@@ -7937,7 +7938,7 @@ HandleMachineMove (char *message, ChessProgramState *cps)
     ChessMove moveType;
     char promoChar;
     char *p, *pv=buf1;
-    int machineWhite;
+    int machineWhite, oldError;
     char *bookHit;
 
     if(cps == &pairing && sscanf(message, "%d-%d", &savedWhitePlayer, &savedBlackPlayer) == 2) {
@@ -7951,7 +7952,7 @@ HandleMachineMove (char *message, ChessProgramState *cps)
        return; // Skim the pairing messages here.
     }
 
-    cps->userError = 0;
+    oldError = cps->userError; cps->userError = 0;
 
 FakeBookMove: // [HGM] book: we jump here to simulate machine moves after book hit
     /*
@@ -8531,7 +8532,7 @@ if(appData.debugMode) fprintf(debugFP, "nodes = %d, %lld\n", (int) programStats.
            }
            if(GetDelayedEvent()) CancelDelayedEvent(), ThawUI(); // [HGM] cancel remaining loading effort scheduled after feature timeout
            DisplayMessage("", ""); // erase waiting message
-           DisplayError(buf1, 0);
+           if(!oldError) DisplayError(buf1, 0); // if reason neatly announced, suppress general error popup
        }
        return;
     }
@@ -12147,7 +12148,7 @@ LoadGame (FILE *f, int gameNumber, char *title, int useList)
       AnalyzeFileEvent();
     }
 
-    if (!matchMode && pos >= 0) {
+    if (!matchMode && pos > 0) {
        ToNrEvent(pos); // [HGM] no autoplay if selected on position
     } else
     if (matchMode || appData.timeDelay == 0) {