Repair flashing of moved piece (XB)
authorH.G.Muller <hgm@hgm-xboard.(none)>
Mon, 21 Mar 2016 11:25:02 +0000 (12:25 +0100)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Tue, 29 Mar 2016 14:51:33 +0000 (16:51 +0200)
The flashing was not working (at least in GTK), because the redraw of
the square needed even processing to show something. So the draw/erase
loop that does the flashing needs to call DoEvents() to make things
visible. This however could lead to recursive processing of LeftClick,
as the press of a click-click move already enters the move and starts
the flashing, so that the release usually comes before the press
processing has finished. Which would cause it to be interpreted as
a second move identical to the first. A static flag inside LeftClick
now makes it ignore clicks during flashing, which is just what we had
to do with the release anyway. Flashing should be suppressed during
sweep-selection under-promotion.

backend.c
board.c

index 5a1780d..9b81c39 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -7525,11 +7525,13 @@ LeftClick (ClickType clickType, int xPix, int yPix)
 {
     int x, y;
     Boolean saveAnimate;
-    static int second = 0, promotionChoice = 0, clearFlag = 0, sweepSelecting = 0;
+    static int second = 0, promotionChoice = 0, clearFlag = 0, sweepSelecting = 0, flashing = 0, saveFlash;
     char promoChoice = NULLCHAR;
     ChessSquare piece;
     static TimeMark lastClickTime, prevClickTime;
 
+    if(flashing) return;
+
     x = EventToSquare(xPix, BOARD_WIDTH);
     y = EventToSquare(yPix, BOARD_HEIGHT);
     if (!flipView && y >= 0) {
@@ -7788,6 +7790,7 @@ LeftClick (ClickType clickType, int xPix, int yPix)
            if(gameInfo.variant != VariantChuChess && PieceToChar(CHUPROMOTED(piece)) == '+') promoSweep = CHUPROMOTED(piece);
            selectFlag = 0; lastX = xPix; lastY = yPix;
            ReportClick("put", x, y); // extra put to prompt engine for 'choice' command
+           saveFlash = appData.flashCount; appData.flashCount = 0;
            Sweep(0); // Pawn that is going to promote: preview promotion piece
            sweepSelecting = 1;
            DisplayMessage("", _("Pull pawn backwards to under-promote"));
@@ -7804,7 +7807,7 @@ LeftClick (ClickType clickType, int xPix, int yPix)
        MarkTargetSquares(1);
     } else if(sweepSelecting) { // this must be the up-click corresponding to the down-click that started the sweep
        sweepSelecting = 0; appData.animate = FALSE; // do not animate, a selected piece already on to-square
-        *promoRestrict = 0;
+        *promoRestrict = 0; appData.flashCount = saveFlash;
        if (appData.animate || appData.highlightLastMove) {
            SetHighlights(fromX, fromY, toX, toY);
        } else {
@@ -7898,6 +7901,7 @@ LeftClick (ClickType clickType, int xPix, int yPix)
        PromotionPopUp(promoChoice);
     } else {
        int oldMove = currentMove;
+       flashing = 1; // prevent recursive calling (by release of to-click) while flashing piece
        UserMoveEvent(fromX, fromY, toX, toY, promoChoice);
        if (!appData.highlightLastMove || gotPremove) ClearHighlights();
        if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY);
@@ -7905,6 +7909,7 @@ LeftClick (ClickType clickType, int xPix, int yPix)
           Explode(boards[currentMove-1], fromX, fromY, toX, toY))
            DrawPosition(TRUE, boards[currentMove]);
        fromX = fromY = -1;
+       flashing = 0;
     }
     appData.animate = saveAnimate;
     if (appData.animate || appData.animateDragging) {
diff --git a/board.c b/board.c
index cb6ae94..000af83 100644 (file)
--- a/board.c
+++ b/board.c
@@ -821,9 +821,11 @@ DrawSquare (int row, int column, ChessSquare piece, int do_flash)
        for (i=0; i<appData.flashCount; ++i) {
            DrawOneSquare(x, y, piece, square_color, 0, tString, bString, 0);
            GraphExpose(currBoard, x, y, squareSize, squareSize);
+           DoEvents(); // requires event processing to actually update screen :-(
            FlashDelay(flash_delay);
            DrawOneSquare(x, y, EmptySquare, square_color, 0, tString, bString, 0);
            GraphExpose(currBoard, x, y, squareSize, squareSize);
+           DoEvents();
            FlashDelay(flash_delay);
        }
     }
@@ -950,8 +952,10 @@ DrawPosition (int repaint, Board board)
        /* Special check for castling so we don't flash both the king
           and the rook (just flash the king). */
        if (do_flash) {
-           /* Mark rook for drawing with NO flashing. */
-           check_castle_draw(board, lastBoard[nr], &rrow, &rcol);
+           if(check_castle_draw(board, lastBoard[nr], &rrow, &rcol)) {
+               /* Mark rook for drawing with NO flashing. */
+               damage[nr][rrow][rcol] |= 1;
+           }
        }
 
        /* First pass -- Erase arrow and grid highlights, but keep square content unchanged. Except for new markers. */