Fix hover event
authorH.G. Muller <h.g.muller@hccnet.nl>
Mon, 30 Sep 2013 10:14:46 +0000 (12:14 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Sun, 22 Dec 2013 22:06:59 +0000 (23:06 +0100)
HoverEvent was relying on highlight-dragging to detect if the mouse pointer
entered a new square, but on XBoard highlight dragging is sick. Now the
routine remembers the previous mouse position independent of the highlights.
To detect if we are in the starting square, it looks for change of the
from-square, in which case it fakes (first) entry of the current square
(where it saves marker state, so it can be restored after we leave the
square again, in case the engine saw fit to respond to the hover command).

backend.c

index f449d26..0e0f80e 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -7169,13 +7169,17 @@ void
 HoverEvent (int xPix, int yPix, int x, int y)
 {
        static char baseMarker[BOARD_RANKS][BOARD_FILES], baseLegal[BOARD_RANKS][BOARD_FILES];
 HoverEvent (int xPix, int yPix, int x, int y)
 {
        static char baseMarker[BOARD_RANKS][BOARD_FILES], baseLegal[BOARD_RANKS][BOARD_FILES];
+       static int oldX = -1, oldY = -1, oldFromX = -1, oldFromY = -1;
        int r, f;
        if(dragging == 2) DragPieceMove(xPix, yPix); // [HGM] lion: drag without button for second leg
        if(!first.highlight) return;
        int r, f;
        if(dragging == 2) DragPieceMove(xPix, yPix); // [HGM] lion: drag without button for second leg
        if(!first.highlight) return;
-       if(hiX == -1 && hiY == -1 && x == fromX && y == fromY) // record markings 
+       if(fromX != oldFromX || fromY != oldFromY)  oldX = oldY = -1; // kludge to fake entry on from-click
+       if(x == oldX && y == oldY) return; // only do something if we enter new square
+       oldFromX = fromX; oldFromY = fromY;
+       if(oldX == -1 && oldY == -1 && x == fromX && y == fromY) // record markings after from-change
          for(r=0; r<BOARD_HEIGHT; r++) for(f=BOARD_LEFT; f<BOARD_RGHT; f++)
            baseMarker[r][f] = marker[r][f], baseLegal[r][f] = legal[r][f];
          for(r=0; r<BOARD_HEIGHT; r++) for(f=BOARD_LEFT; f<BOARD_RGHT; f++)
            baseMarker[r][f] = marker[r][f], baseLegal[r][f] = legal[r][f];
-       else if(hiX != x || hiY != y) {
+       else if(oldX != x || oldY != y) {
          // [HGM] lift: entered new to-square; redraw arrow, and inform engine
          for(r=0; r<BOARD_HEIGHT; r++) for(f=BOARD_LEFT; f<BOARD_RGHT; f++)
            marker[r][f] = baseMarker[r][f], legal[r][f] = baseLegal[r][f];
          // [HGM] lift: entered new to-square; redraw arrow, and inform engine
          for(r=0; r<BOARD_HEIGHT; r++) for(f=BOARD_LEFT; f<BOARD_RGHT; f++)
            marker[r][f] = baseMarker[r][f], legal[r][f] = baseLegal[r][f];
@@ -7184,7 +7188,8 @@ HoverEvent (int xPix, int yPix, int x, int y)
            snprintf(buf, MSG_SIZ, "hover %c%d\n", x + AAA, y + ONE - '0');
            SendToProgram(buf, &first);
          }
            snprintf(buf, MSG_SIZ, "hover %c%d\n", x + AAA, y + ONE - '0');
            SendToProgram(buf, &first);
          }
-         SetHighlights(fromX, fromY, x, y);
+         oldX = x; oldY = y;
+//       SetHighlights(fromX, fromY, x, y);
        }
 }
 
        }
 }