diff -aur ./common.h xboard-4.2.7/common.h --- ./common.h 2003-10-28 05:21:00.000000000 +1000 +++ xboard-4.2.7/common.h 2004-02-06 01:48:08.000000000 +1000 @@ -130,6 +130,7 @@ #define DARK_SQUARE_COLOR "#77A26D" #define JAIL_SQUARE_COLOR "#808080" #define HIGHLIGHT_SQUARE_COLOR "#FFFF00" +#define MOVE_SQUARE_COLOR "#4C00FF" #define PREMOVE_HIGHLIGHT_COLOR "#FF0000" #define BELLCHAR '\007' #define NULLCHAR '\000' @@ -265,6 +266,7 @@ char *darkSquareColor; char *jailSquareColor; char *highlightSquareColor; + char *moveSquareColor; char *premoveHighlightColor; #else int whitePieceColor; @@ -273,6 +275,7 @@ int darkSquareColor; int jailSquareColor; int highlightSquareColor; + int moveSquareColor; int premoveHighlightColor; #endif int movesPerSession; @@ -424,6 +427,7 @@ char *zippyVariants; int zippyMaxGames; int zippyReplayTimeout; /*seconds*/ + Boolean showLegalMoves; #endif } AppData, *AppDataPtr; diff -aur ./xboard.c xboard-4.2.7/xboard.c --- ./xboard.c 2003-11-19 18:42:18.000000000 +1000 +++ xboard-4.2.7/xboard.c 2004-02-06 01:52:45.000000000 +1000 @@ -185,6 +185,7 @@ #include "common.h" #include "frontend.h" #include "backend.h" +#include "backendz.h" #include "moves.h" #include "xboard.h" #include "childio.h" @@ -385,6 +386,8 @@ Cardinal *nprms)); void TestLegalityProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void ShowLegalMovesProc P((Widget w, XEvent *event, String *prms, + Cardinal *nprms)); void InfoProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void ManProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void HintProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); @@ -408,6 +411,9 @@ static void DrawDragPiece P((void)); char *ModeToWidgetName P((GameMode mode)); +static void ShowLegalPieceSquares(int boardX,int boardY); +static void UnShowLegalPieceSquares(); + /* * XBoard depends on Xt R4 or higher */ @@ -417,9 +423,9 @@ Display *xDisplay; Window xBoardWindow; Pixel lightSquareColor, darkSquareColor, whitePieceColor, blackPieceColor, - jailSquareColor, highlightSquareColor, premoveHighlightColor; + jailSquareColor, highlightSquareColor, moveSquareColor, premoveHighlightColor; GC lightSquareGC, darkSquareGC, jailSquareGC, lineGC, wdPieceGC, wlPieceGC, - bdPieceGC, blPieceGC, wbPieceGC, bwPieceGC, coordGC, highlineGC, + bdPieceGC, blPieceGC, wbPieceGC, bwPieceGC, coordGC, highlineGC, wjPieceGC, bjPieceGC, prelineGC; Pixmap iconPixmap, wIconPixmap, bIconPixmap, xMarkPixmap; Widget shellWidget, layoutWidget, formWidget, boardWidget, messageWidget, @@ -605,6 +611,7 @@ {"Show Coords", ShowCoordsProc}, {"Show Thinking", ShowThinkingProc}, {"Test Legality", TestLegalityProc}, + {"Show Legal Moves",ShowLegalMovesProc}, {NULL, NULL} }; @@ -739,6 +746,9 @@ { "highlightSquareColor", "highlightSquareColor", XtRString, sizeof(String), XtOffset(AppDataPtr, highlightSquareColor), XtRString, HIGHLIGHT_SQUARE_COLOR }, + { "moveSquareColor", "moveSquareColor", XtRString, + sizeof(String), XtOffset(AppDataPtr, moveSquareColor), + XtRString, MOVE_SQUARE_COLOR }, { "premoveHighlightColor", "premoveHighlightColor", XtRString, sizeof(String), XtOffset(AppDataPtr, premoveHighlightColor), XtRString, PREMOVE_HIGHLIGHT_COLOR }, @@ -1144,6 +1154,7 @@ { "-lightSquareColor", "lightSquareColor", XrmoptionSepArg, NULL }, { "-darkSquareColor", "darkSquareColor", XrmoptionSepArg, NULL }, { "-highlightSquareColor", "highlightSquareColor", XrmoptionSepArg, NULL }, + { "-moveSquareColor", "moveSquareColor", XrmoptionSepArg, NULL }, { "-premoveHighlightColor", "premoveHighlightColor", XrmoptionSepArg,NULL}, { "-movesPerSession", "movesPerSession", XrmoptionSepArg, NULL }, { "-mps", "movesPerSession", XrmoptionSepArg, NULL }, @@ -1522,6 +1533,7 @@ { "ShowCoordsProc", ShowCoordsProc }, { "ShowThinkingProc", ShowThinkingProc }, { "TestLegalityProc", TestLegalityProc }, + { "ShowLegalMovesProc", ShowLegalMovesProc }, { "InfoProc", InfoProc }, { "ManProc", ManProc }, { "HintProc", HintProc }, @@ -2068,6 +2080,18 @@ } if (!appData.monoMode) { + vFrom.addr = (caddr_t) appData.moveSquareColor; + vFrom.size = strlen(appData.moveSquareColor); + XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); + if (vTo.addr == NULL) { + appData.monoMode = True; + forceMono = True; + } else { + moveSquareColor = *(Pixel *) vTo.addr; + } + } + + if (!appData.monoMode) { vFrom.addr = (caddr_t) appData.premoveHighlightColor; vFrom.size = strlen(appData.premoveHighlightColor); XtConvert(shellWidget, XtRString, &vFrom, XtRPixel, &vTo); @@ -6264,6 +6288,25 @@ DrawPosition(True, NULL); } +/* show legal moves on board when moving/dragging a piece */ +void ShowLegalMovesProc(w, event, prms, nprms) + Widget w; + XEvent *event; + String *prms; + Cardinal *nprms; +{ + Arg args[16]; + appData.showLegalMoves = !appData.showLegalMoves; + + if (appData.showLegalMoves) { + XtSetArg(args[0], XtNleftBitmap, xMarkPixmap); + } else { + XtSetArg(args[0], XtNleftBitmap, None); + } + XtSetValues(XtNameToWidget(menuBarWidget, "menuOptions.Show Legal Moves"), + args, 1); +} + void TestLegalityProc(w, event, prms, nprms) Widget w; XEvent *event; @@ -8361,11 +8404,13 @@ damage[toY][toX] = True; } + static void DragPieceBegin(x, y) int x; int y; { - int boardX, boardY, color; + + int boardX, boardY, color; XPoint corner; /* Are we animating? */ @@ -8399,6 +8444,10 @@ if (player.dragPiece >= 0 && player.dragPiece < EmptySquare) { player.dragActive = True; BeginAnimation(&player, player.dragPiece, color, &corner); + + /* show the squares where this piece can be legally moved */ + ShowLegalPieceSquares(fromX,fromY); + /* Mark this square as needing to be redrawn. Note that we don't remove the piece though, since logically (ie as seen by opponent) the move hasn't been made yet. */ @@ -8408,6 +8457,94 @@ } } +/* squares that are highlighted from moving a piece */ +static int xHighlights[BOARD_SIZE*BOARD_SIZE]; +static int yHighlights[BOARD_SIZE*BOARD_SIZE]; + +/* highlight squares where legal moves can be made by current piece */ +static void ShowLegalPieceSquares(boardX,boardY) + int boardX;int boardY; +{ + + int x, y, currHighlight = 0, i = 0; + + if ( ! appData.showLegalMoves ) return; + + for ( i = 0 ; i < BOARD_SIZE; i++ ) + { + xHighlights[i] = -1; + yHighlights[i] = -1; + } + + for ( x = 0; x < BOARD_SIZE ; x++) + { + for ( y = 0 ; y < BOARD_SIZE; y++) + { + int legalmove = LegalityTest(boards[currentMove], + PosFlags(currentMove), + EP_UNKNOWN, fromY, fromX, y,x,0); +#ifdef DEBUG_MOVE_PIECES + printf("Move from %d %d to %d %d == %s - currentMove = %d\n",boardX,boardY,x,y,(legalmove == IllegalMove || legalmove == ImpossibleMove)?"Illegal move":"Legal move",currentMove); + +#endif + + if ( legalmove != IllegalMove && legalmove != ImpossibleMove) + { + GC movepieceGC; + XtGCMask value_mask = GCLineWidth | GCLineStyle | GCForeground + | GCBackground | GCFunction | GCPlaneMask; + XGCValues gc_values; + gc_values.plane_mask = AllPlanes; + gc_values.line_width = lineGap; + gc_values.line_style = LineSolid; + gc_values.function = GXcopy; + +#ifdef DEBUG_MOVE_PIECES + printf("Highlight x = %d y = %d\n",x,y); +#endif + gc_values.foreground = moveSquareColor; + gc_values.background = moveSquareColor; + + drawHighlight(x,y,XtGetGC(shellWidget, value_mask, &gc_values)); + xHighlights[currHighlight] = x; + yHighlights[currHighlight] = y; + currHighlight++; + } + } + } +} + +/* remove highlights from squares that were highlighted + as a result of picking up a piece and showing the legal moves */ +static void UnShowLegalPieceSquares() +{ + int i = 0, boardX, boardY, color; + GC clearpieceGC; + XtGCMask value_mask = GCLineWidth | GCLineStyle | GCForeground + | GCBackground | GCFunction | GCPlaneMask; + XGCValues gc_values; + if ( ! appData.showLegalMoves ) return; + + gc_values.plane_mask = AllPlanes; + gc_values.line_width = lineGap; + gc_values.line_style = LineSolid; + gc_values.function = GXcopy; + + gc_values.foreground = jailSquareColor; + gc_values.background = jailSquareColor; + + for ( i = 0 ; i < BOARD_SIZE*BOARD_SIZE && xHighlights[i] != -1 && yHighlights[i] != -1; i++ ) + { + clearpieceGC = XtGetGC(shellWidget, value_mask, &gc_values); +#ifdef DEBUG_MOVE_PIECES + printf("Erasing %d %d\n",BOARD_SIZE*BOARD_SIZE,xHighlights[i],yHighlights[i]); +#endif + drawHighlight(xHighlights[i], yHighlights[i],clearpieceGC); + xHighlights[i] = -1; + yHighlights[i] = -1; + } +} + static void DragPieceMove(x, y) int x; int y; @@ -8427,10 +8564,11 @@ corner.y = y - player.mouseDelta.y; AnimationFrame(&player, &corner, player.dragPiece); #if HIGHDRAG - if (appData.highlightDragging) { - int boardX, boardY; - BoardSquare(x, y, &boardX, &boardY); - SetHighlights(fromX, fromY, boardX, boardY); + if (appData.highlightDragging) + { + int boardX, boardY; + BoardSquare(x, y, &boardX, &boardY); + SetHighlights(fromX, fromY, boardX, boardY); } #endif } @@ -8439,7 +8577,8 @@ DragPieceEnd(x, y) int x; int y; { - int boardX, boardY, color; + int boardX, boardY, color; + XPoint corner; /* Are we animating? */ @@ -8461,6 +8600,9 @@ /* This prevents weird things happening with fast successive clicks which on my Sun at least can cause motion events without corresponding press/release. */ + + /* un highlight the squares where the piece can be legally moved */ + UnShowLegalPieceSquares(); player.dragActive = False; } Only in .: xboard.txt Only in .: zic2xpm.txt