Send continuation lines to chat box they belong to
[xboard.git] / backend.c
index e0e1ab2..fe325db 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -2493,14 +2493,14 @@ read_from_ics(isr, closure, data, count, error)
                if(channel >= 0) // channel broadcast; look if there is a chatbox for this channel
                for(p=0; p<MAX_CHAT; p++) {
                    if(channel == atoi(chatPartner[p])) {
-                   talker[0] = '['; strcat(talker, "]");
+                   talker[0] = '['; strcat(talker, "] ");
                    chattingPartner = p; break;
                    }
                } else
                if(buf[i-3] == 'r') // whisper; look if there is a WHISPER chatbox
                for(p=0; p<MAX_CHAT; p++) {
                    if(!strcmp("WHISPER", chatPartner[p])) {
-                       talker[0] = '['; strcat(talker, "]");
+                       talker[0] = '['; strcat(talker, "] ");
                        chattingPartner = p; break;
                    }
                }
@@ -2512,7 +2512,7 @@ read_from_ics(isr, closure, data, count, error)
                if(chattingPartner<0) i = oldi; else {
                    started = STARTED_COMMENT;
                    parse_pos = 0; parse[0] = NULLCHAR;
-                   savingComment = TRUE;
+                   savingComment = 3 + chattingPartner; // counts as TRUE
                    suppressKibitz = TRUE;
                }
            } // [HGM] chat: end of patch
@@ -2707,6 +2707,8 @@ read_from_ics(isr, closure, data, count, error)
                    memcpy(parse, &buf[oldi], parse_pos);
                    parse[parse_pos] = NULLCHAR;
                    started = STARTED_COMMENT;
+                   if(savingComment >= 3) // [HGM] chat: continuation of line for chat box
+                       chattingPartner = savingComment - 3; // kludge to remember the box
                } else {
                    started = STARTED_CHATTER;
                }
@@ -5943,14 +5945,19 @@ void LeftClick(ClickType clickType, int xPix, int yPix)
 
 int RightClick(ClickType action, int x, int y, int *fromX, int *fromY)
 {   // front-end-free part taken out of PieceMenuPopup
-    int whichMenu;
+    int whichMenu; int xSqr, ySqr;
 
+    xSqr = EventToSquare(x, BOARD_WIDTH);
+    ySqr = EventToSquare(y, BOARD_HEIGHT);
     if (action == Release) UnLoadPV(); // [HGM] pv
     if (action != Press) return -2;
     switch (gameMode) {
-      case EditPosition:
       case IcsExamining:
-       whichMenu = 0;
+       if(xSqr < BOARD_LEFT || xSqr >= BOARD_RGHT) return -1;\r
+      case EditPosition:
+       if (xSqr == BOARD_LEFT-1 || xSqr == BOARD_RGHT) return -1;\r
+       if (xSqr < 0 || ySqr < 0) return -1;\r
+       whichMenu = 0; // edit-position menu
        break;
       case IcsObserving:
        if(!appData.icsEngineAnalyze) return -1;
@@ -5964,23 +5971,24 @@ int RightClick(ClickType action, int x, int y, int *fromX, int *fromY)
       case TwoMachinesPlay: // [HGM] pv: use for showing PV
        if (!appData.dropMenu) {
          LoadPV(x, y);
-         return -1;
+         return 2; // flag front-end to grab mouse events
        }
        if(gameMode == TwoMachinesPlay || gameMode == AnalyzeMode ||
            gameMode == AnalyzeFile || gameMode == IcsObserving) return -1;
       case EditGame:
       noZip:
+       if (xSqr < 0 || ySqr < 0) return -1;
        if (!appData.dropMenu || appData.testLegality &&
            gameInfo.variant != VariantBughouse &&
            gameInfo.variant != VariantCrazyhouse) return -1;
-       whichMenu = 1;
+       whichMenu = 1; // drop menu
        break;
       default:
        return -1;
     }
 
-    if (((*fromX = EventToSquare(x, BOARD_WIDTH)) < 0) ||
-       ((*fromY = EventToSquare(y, BOARD_HEIGHT)) < 0)) {
+    if (((*fromX = xSqr) < 0) ||
+       ((*fromY = ySqr) < 0)) {
        *fromX = *fromY = -1;
        return -1;
     }