Allow ICS context menu to pop up a Chat Box on clicking handle
[xboard.git] / backend.c
index 4ac6084..f0811fd 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -2089,7 +2089,7 @@ PlotSeekAd(int i)
        if(r > maxRating) r = maxRating;
        if(tc < 1.) tc = 1.;
        if(tc > 95.) tc = 95.;
-       x = (w-hMargin)* log(tc)/log(100.) + hMargin;
+       x = (w-hMargin-squareSize/8-7)* log(tc)/log(95.) + hMargin;
        y = ((double)r - minRating)/(maxRating - minRating)
            * (h-vMargin-squareSize/8-1) + vMargin;
        if(ratingList[i] < 0) y = vMargin + squareSize/4;
@@ -2201,7 +2201,7 @@ DrawSeekGraph()
     }
     DrawSeekText("unrated", hMargin+squareSize/8+7, h-1-vMargin-squareSize/4);
     for(i=1; i<100; i+=(i<10?1:5)) {
-       int xx = (w-hMargin)* log((double)i)/log(100.) + hMargin;
+       int xx = (w-hMargin-squareSize/8-7)* log((double)i)/log(95.) + hMargin;
        DrawSeekAxis(xx, h-1-vMargin, xx, h-6-vMargin-3*(i%10==0)); // TC ticks
        if(i<=5 || (i>40 ? i%20 : i%10) == 0) {
            char buf[MSG_SIZ];
@@ -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, "*% ")) {