Allow recalling history in ICS input box with arrow keys
[xboard.git] / backend.c
index 4ac6084..9636abc 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -2237,15 +2237,16 @@ int SeekGraphClick(ClickType click, int x, int y, int moving)
                DisplayMessage(second ? "!" : "", seekAdList[closest]);
                lastSecond = second; displayed = closest;
            }
-           sprintf(buf, "play %d\n", seekNrList[closest]);
            if(click == Press) {
                if(moving == 2) zList[closest] = 100; // right-click; push to back on press
                lastDown = closest;
                return TRUE;
            } // on press 'hit', only show info
            if(moving == 2) return TRUE; // ignore right up-clicks on dot
+           sprintf(buf, "play %d\n", seekNrList[closest]);
            SendToICS(ics_prefix);
-           SendToICS(buf); // should this be "sought all"?
+           SendToICS(buf);
+           return TRUE; // let incoming board of started game pop down the graph
        } else if(click == Release) { // release 'miss' is ignored
            zList[lastDown] = 100; // make future selection of the rejected ad more difficult
            if(moving == 2) { // right up-click
@@ -2729,7 +2730,9 @@ read_from_ics(isr, closure, data, count, error)
            if(started == STARTED_NONE && (looking_at(buf, &i, "* tells you:") || looking_at(buf, &i, "* says:") || 
                                           looking_at(buf, &i, "* whispers:") ||
                                           looking_at(buf, &i, "*(*):") && (sscanf(star_match[1], "%d", &channel),1) ||
-                                          looking_at(buf, &i, "*(*)(*):") && sscanf(star_match[2], "%d", &channel) == 1 )) {
+                                          looking_at(buf, &i, "*(*)(*):") && (sscanf(star_match[2], "%d", &channel),1) ||
+                                          looking_at(buf, &i, "*(*)(*)(*):") && (sscanf(star_match[3], "%d", &channel),1) ||
+                                          looking_at(buf, &i, "*(*)(*)(*)(*):") && sscanf(star_match[4], "%d", &channel) == 1 )) {
                int p;
                sscanf(star_match[0], "%[^(]", talker+1); // strip (C) or (U) off ICS handle
                chattingPartner = -1;
@@ -3566,8 +3569,8 @@ read_from_ics(isr, closure, data, count, error)
                    if (appData.debugMode)
                       fprintf(debugFP, "Parsing holdings: %s, currentMove = %d\n",
                                                         parse, currentMove);
-                   if (sscanf(parse, " game %d", &gamenum) == 1 &&
-                       gamenum == ics_gamenum) {
+                   if (sscanf(parse, " game %d", &gamenum) == 1) {
+                     if(gamenum == ics_gamenum) { // [HGM] bughouse: old code if part of foreground game
                        if (gameInfo.variant == VariantNormal) {
                           /* [HGM] We seem to switch variant during a game!
                            * Presumably no holdings were displayed, so we have
@@ -3619,6 +3622,17 @@ read_from_ics(isr, closure, data, count, error)
 
                         DrawPosition(FALSE, boards[currentMove]);
                        DisplayTitle(str);
+                     } else if(appData.bgObserve) { // [HGM] bughouse: holdings of other game => background
+                       sscanf(parse, "game %d white [%s black [%s <- %s",
+                              &gamenum, white_holding, black_holding,
+                              new_piece);
+                        white_holding[strlen(white_holding)-1] = NULLCHAR;
+                        black_holding[strlen(black_holding)-1] = NULLCHAR;
+                        /* [HGM] copy holdings to partner-board holdings area */
+                        CopyHoldings(partnerBoard, white_holding, WhitePawn);
+                        CopyHoldings(partnerBoard, black_holding, BlackPawn);
+                        if(partnerUp) DrawPosition(FALSE, partnerBoard);
+                     }
                    }
                    /* Suppress following prompt */
                    if (looking_at(buf, &i, "*% ")) {