X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xboard.c;h=80db3980ec7cef890d92a0eb9f7c4c63ea8857bf;hb=919bb8ce56406c6059ec9d3221d1bc96ad388d1c;hp=e9a4dc274da60c470467aac054f789d4a1b6e917;hpb=4a8d41d0be4291df44a78bbf346c841a8710799c;p=xboard.git diff --git a/xboard.c b/xboard.c index e9a4dc2..80db398 100644 --- a/xboard.c +++ b/xboard.c @@ -5,7 +5,7 @@ * Massachusetts. * * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006, - * 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. + * 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. * * The following terms apply to Digital Equipment Corporation's copyright * interest in XBoard: @@ -142,6 +142,10 @@ extern char *getenv(); # endif #endif +#if ENABLE_NLS +#include +#endif + #include #include #include @@ -234,6 +238,8 @@ typedef struct { String name; String ref; MenuItem *mi; + int textWidth; + Widget subMenu; } Menu; int main P((int argc, char **argv)); @@ -243,14 +249,20 @@ RETSIGTYPE CmailSigHandler P((int sig)); RETSIGTYPE IntSigHandler P((int sig)); RETSIGTYPE TermSizeSigHandler P((int sig)); void CreateGCs P((int redo)); +void CreateAnyPieces P((void)); void CreateXIMPieces P((void)); void CreateXPMPieces P((void)); void CreateXPMBoard P((char *s, int n)); void CreatePieces P((void)); void CreatePieceMenus P((void)); -Widget CreateMenuBar P((Menu *mb)); +Widget CreateMenuBar P((Menu *mb, int boardWidth)); Widget CreateButtonBar P ((MenuItem *mi)); +#if ENABLE_NLS +char *InsertPxlSize P((char *pattern, int targetPxlSize)); +XFontSet CreateFontSet P((char *base_fnt_lst)); +#else char *FindFont P((char *pattern, int targetPxlSize)); +#endif void PieceMenuPopup P((Widget w, XEvent *event, String *params, Cardinal *num_params)); static void PieceMenuSelect P((Widget w, ChessSquare piece, caddr_t junk)); @@ -261,6 +273,8 @@ void CreateGrid P((void)); int EventToSquare P((int x, int limit)); void DrawSquare P((int row, int column, ChessSquare piece, int do_flash)); void EventProc P((Widget widget, caddr_t unused, XEvent *event)); +void DelayedDrag P((void)); +void MoveTypeInProc P((Widget widget, caddr_t unused, XEvent *event)); void HandleUserMove P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void AnimateUserMove P((Widget w, XEvent * event, @@ -365,6 +379,7 @@ void ResignProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void AdjuWhiteProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void AdjuBlackProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void AdjuDrawProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void TypeInProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void EnterKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void UpKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void DownKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); @@ -375,6 +390,9 @@ void StopExaminingProc P((Widget w, XEvent *event, String *prms, void UploadProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void BackwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void ForwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void TempBackwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void TempForwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +Boolean TempBackwardActive = False; void ToStartProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void ToEndProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void RevertProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); @@ -426,13 +444,16 @@ void SaveSettingsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms) void SaveOnExitProc 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 GuideProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void HomePageProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void NewsPageProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void BugReportProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void HintProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void BookProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void AboutGameProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void AboutProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void DebugProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void NothingProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); -void Iconify P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void DisplayMove P((int moveNumber)); void DisplayTitle P((char *title)); void ICSInitScript P((void)); @@ -451,6 +472,7 @@ void TimeControlProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)) void OptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void NewVariantProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void IcsTextProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void LoadEngineProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void FirstSettingsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void SecondSettingsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void GameListOptionsPopUp P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); @@ -459,9 +481,9 @@ void SoundOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms) void BoardOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void LoadOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void SaveOptionsProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void EditBookProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); +void SelectMove P((Widget w, XEvent * event, String * params, Cardinal * nParams)); void GameListOptionsPopDown P(()); -void ShufflePopDown P(()); -void TimeControlPopDown P(()); void GenericPopDown P(()); void update_ics_width P(()); int get_term_width P(()); @@ -494,8 +516,14 @@ int hOffset; // [HGM] dual XSegment secondSegments[BOARD_RANKS + BOARD_FILES + 2]; XSegment gridSegments[BOARD_RANKS + BOARD_FILES + 2]; XSegment jailGridSegments[BOARD_RANKS + BOARD_FILES + 6]; -Font clockFontID, coordFontID, countFontID; -XFontStruct *clockFontStruct, *coordFontStruct, *countFontStruct; +#if ENABLE_NLS +XFontSet fontSet, clockFontSet; +#else +Font clockFontID; +XFontStruct *clockFontStruct; +#endif +Font coordFontID, countFontID; +XFontStruct *coordFontStruct, *countFontStruct; XtAppContext appContext; char *layoutName; char *oldICSInteractionTitle; @@ -517,6 +545,7 @@ int squareSize, smallLayout = 0, tinyLayout = 0, ICSInputBoxUp = False, askQuestionUp = False, filenameUp = False, promotionUp = False, pmFromX = -1, pmFromY = -1, errorUp = False, errorExitStatus = -1, lineGap, defaultLineGap; +Dimension textHeight; Pixel timerForegroundPixel, timerBackgroundPixel; Pixel buttonForegroundPixel, buttonBackgroundPixel; char *chessDir, *programName, *programVersion, @@ -628,6 +657,7 @@ MenuItem editMenu[] = { {N_("Edit Position Ctrl+Shift+E"), "Edit Position", EditPositionProc}, {N_("Edit Tags"), "Edit Tags", EditTagsProc}, {N_("Edit Comment"), "Edit Comment", EditCommentProc}, + {N_("Edit Book"), "Edit Book", EditBookProc}, {"----", NULL, NothingProc}, {N_("Revert Home"), "Revert", RevertProc}, {N_("Annotate"), "Annotate", AnnotateProc}, @@ -663,7 +693,7 @@ MenuItem modeMenu[] = { {N_("Machine Black Ctrl+B"), "Machine Black", MachineBlackProc}, {N_("Two Machines Ctrl+T"), "Two Machines", TwoMachinesProc}, {N_("Analysis Mode Ctrl+A"), "Analysis Mode", AnalyzeModeProc}, - {N_("Analyze File Ctrl+F"), "Analyze File", AnalyzeFileProc }, + {N_("Analyze Game Ctrl+G"), "Analyze File", AnalyzeFileProc }, {N_("Edit Game Ctrl+E"), "Edit Game", EditGameProc}, {N_("Edit Position Ctrl+Shift+E"), "Edit Position", EditPositionProc}, {N_("Training"), "Training", TrainingProc}, @@ -696,6 +726,8 @@ MenuItem actionMenu[] = { }; MenuItem engineMenu[] = { + {N_("Load New Engine ..."), "Load Engine", LoadEngineProc}, + {"----", NULL, NothingProc}, {N_("Engine #1 Settings ..."), "Engine #1 Settings", FirstSettingsProc}, {N_("Engine #2 Settings ..."), "Engine #2 Settings", SecondSettingsProc}, {"----", NULL, NothingProc}, @@ -758,6 +790,11 @@ MenuItem helpMenu[] = { {N_("Info XBoard"), "Info XBoard", InfoProc}, {N_("Man XBoard F1"), "Man XBoard", ManProc}, {"----", NULL, NothingProc}, + {N_("XBoard Home Page"), "Home Page", HomePageProc}, + {N_("On-line User Guide"), "User Guide", GuideProc}, + {N_("Development News"), "News Page", NewsPageProc}, + {N_("e-Mail Bug Report"), "Bug Report", BugReportProc}, + {"----", NULL, NothingProc}, {N_("About XBoard"), "About XBoard", AboutProc}, {NULL, NULL, NULL} }; @@ -778,7 +815,7 @@ Menu menuBar[] = { MenuItem buttonBar[] = { {"<<", "<<", ToStartProc}, {"<", "<", BackwardProc}, - {PAUSE_BUTTON, PAUSE_BUTTON, PauseProc}, + {N_(PAUSE_BUTTON), PAUSE_BUTTON, PauseProc}, {">", ">", ForwardProc}, {">>", ">>", ToEndProc}, {NULL, NULL, NULL} @@ -795,7 +832,7 @@ String pieceMenuStrings[2][PIECE_MENU_SIZE] = { N_("Archbishop"), N_("Chancellor"), "----", N_("Promote"), N_("Demote"), N_("Empty square"), N_("Clear board") } }; -/* must be in same order as PieceMenuStrings! */ +/* must be in same order as pieceMenuStrings! */ ChessSquare pieceMenuTranslation[2][PIECE_MENU_SIZE] = { { WhitePlay, (ChessSquare) 0, WhitePawn, WhiteKnight, WhiteBishop, WhiteRook, WhiteQueen, WhiteKing, (ChessSquare) 0, WhiteAlfil, @@ -811,7 +848,7 @@ ChessSquare pieceMenuTranslation[2][PIECE_MENU_SIZE] = { String dropMenuStrings[DROP_MENU_SIZE] = { "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"), N_("Queen") }; -/* must be in same order as PieceMenuStrings! */ +/* must be in same order as dropMenuStrings! */ ChessSquare dropMenuTranslation[DROP_MENU_SIZE] = { (ChessSquare) 0, WhitePawn, WhiteKnight, WhiteBishop, WhiteRook, WhiteQueen @@ -899,7 +936,6 @@ XtActionsRec boardActions[] = { { "PieceMenuPopup", PieceMenuPopup }, { "WhiteClock", WhiteClock }, { "BlackClock", BlackClock }, - { "Iconify", Iconify }, { "ResetProc", ResetProc }, { "NewVariantProc", NewVariantProc }, { "LoadGameProc", LoadGameProc }, @@ -935,7 +971,8 @@ XtActionsRec boardActions[] = { { "EvalGraphProc", EvalGraphProc}, // [HGM] Winboard_x avaluation graph window { "ShowGameListProc", ShowGameListProc }, { "ShowMoveListProc", HistoryShowProc}, - { "EditTagsProc", EditCommentProc }, + { "EditTagsProc", EditTagsProc }, + { "EditBookProc", EditBookProc }, { "EditCommentProc", EditCommentProc }, { "IcsInputBoxProc", IcsInputBoxProc }, { "PauseProc", PauseProc }, @@ -950,6 +987,7 @@ XtActionsRec boardActions[] = { { "AdjuWhiteProc", AdjuWhiteProc }, { "AdjuBlackProc", AdjuBlackProc }, { "AdjuDrawProc", AdjuDrawProc }, + { "TypeInProc", TypeInProc }, { "EnterKeyProc", EnterKeyProc }, { "UpKeyProc", UpKeyProc }, { "DownKeyProc", DownKeyProc }, @@ -958,6 +996,8 @@ XtActionsRec boardActions[] = { { "UploadProc", UploadProc }, { "BackwardProc", BackwardProc }, { "ForwardProc", ForwardProc }, + { "TempBackwardProc", TempBackwardProc }, + { "TempForwardProc", TempForwardProc }, { "ToStartProc", ToStartProc }, { "ToEndProc", ToEndProc }, { "RevertProc", RevertProc }, @@ -1013,13 +1053,11 @@ XtActionsRec boardActions[] = { { "GameListPopDown", (XtActionProc) GameListPopDown }, { "GameListOptionsPopDown", (XtActionProc) GameListOptionsPopDown }, { "PromotionPopDown", (XtActionProc) PromotionPopDown }, - { "HistoryPopDown", (XtActionProc) HistoryPopDown }, { "EngineOutputPopDown", (XtActionProc) EngineOutputPopDown }, { "EvalGraphPopDown", (XtActionProc) EvalGraphPopDown }, - { "ShufflePopDown", (XtActionProc) ShufflePopDown }, - { "TimeControlPopDown", (XtActionProc) TimeControlPopDown }, { "GenericPopDown", (XtActionProc) GenericPopDown }, { "CopyMemoProc", (XtActionProc) CopyMemoProc }, + { "SelectMove", (XtActionProc) SelectMove }, }; char globalTranslations[] = @@ -1029,6 +1067,8 @@ char globalTranslations[] = :Ctrlo: LoadGameProc() \n \ :MetaNext: LoadNextGameProc() \n \ :MetaPrior: LoadPrevGameProc() \n \ + :CtrlDown: LoadSelectedProc(3) \n \ + :CtrlUp: LoadSelectedProc(-3) \n \ :Ctrls: SaveGameProc() \n \ :Ctrlc: CopyGameProc() \n \ :Ctrlv: PasteGameProc() \n \ @@ -1043,7 +1083,7 @@ char globalTranslations[] = :Ctrlb: MachineBlackProc() \n \ :Ctrlt: TwoMachinesProc() \n \ :Ctrla: AnalysisModeProc() \n \ - :Ctrlf: AnalyzeFileProc() \n \ + :Ctrlg: AnalyzeFileProc() \n \ :Ctrle: EditGameProc() \n \ :CtrlE: EditPositionProc() \n \ :MetaO: EngineOutputProc() \n \ @@ -1065,6 +1105,8 @@ char globalTranslations[] = :MetaRight: ForwardProc() \n \ :MetaHome: ToStartProc() \n \ :MetaLeft: BackwardProc() \n \ + :Left: BackwardProc() \n \ + :Right: ForwardProc() \n \ :Home: RevertProc() \n \ :End: TruncateGameProc() \n \ :Ctrlm: MoveNowProc() \n \ @@ -1082,15 +1124,10 @@ char globalTranslations[] = :CtrlH: HideThinkingProc() \n " #endif "\ - :-: Iconify() \n \ :F1: ManProc() \n \ :F2: FlipViewProc() \n \ - .: BackwardProc() \n \ - .: ForwardProc() \n \ - Shift1: AskQuestionProc(\"Direct command\",\ - \"Send to chess program:\",,1) \n \ - Shift2: AskQuestionProc(\"Direct command\",\ - \"Send to second chess program:\",,2) \n"; + :Return: TempBackwardProc() \n \ + :Return: TempForwardProc() \n"; char boardTranslations[] = ": HandleUserMove(0) \n \ @@ -1098,7 +1135,9 @@ char boardTranslations[] = : HandleUserMove(0) \n \ : AnimateUserMove() \n \ : HandlePV() \n \ + : HandlePV() \n \ : PieceMenuPopup(menuB) \n \ + : PieceMenuPopup(menuB) \n \ Shift: XawPositionSimpleMenu(menuB) XawPositionSimpleMenu(menuD)\ PieceMenuPopup(menuB) \n \ Any: XawPositionSimpleMenu(menuW) XawPositionSimpleMenu(menuD) \ @@ -1108,8 +1147,12 @@ char boardTranslations[] = Any: XawPositionSimpleMenu(menuB) XawPositionSimpleMenu(menuD) \ PieceMenuPopup(menuB) \n"; -char whiteTranslations[] = ": WhiteClock()\n"; -char blackTranslations[] = ": BlackClock()\n"; +char whiteTranslations[] = + "Shift: WhiteClock(1)\n \ + : WhiteClock(0)\n"; +char blackTranslations[] = + "Shift: BlackClock(1)\n \ + : BlackClock(0)\n"; char ICSInputTranslations[] = "Up: UpKeyProc() \n " @@ -1137,10 +1180,7 @@ static int xpm_avail[MAXSQSIZE]; /* Extract piece size from filename */ static int -xpm_getsize(name, len, ext) - char *name; - int len; - char *ext; +xpm_getsize (char *name, int len, char *ext) { char *p, *d; char buf[10]; @@ -1164,9 +1204,7 @@ xpm_getsize(name, len, ext) /* Setup xpm_avail */ static int -xpm_getavail(dirname, ext) - char *dirname; - char *ext; +xpm_getavail (char *dirname, char *ext) { DIR *dir; struct dirent *ent; @@ -1198,9 +1236,7 @@ xpm_getavail(dirname, ext) } void -xpm_print_avail(fp, ext) - FILE *fp; - char *ext; +xpm_print_avail (FILE *fp, char *ext) { int i; @@ -1213,10 +1249,7 @@ xpm_print_avail(fp, ext) /* Return XPM piecesize closest to size */ int -xpm_closest_to(dirname, size, ext) - char *dirname; - int size; - char *ext; +xpm_closest_to (char *dirname, int size, char *ext) { int i; int sm_diff = MAXSQSIZE; @@ -1251,16 +1284,13 @@ xpm_closest_to(dirname, size, ext) read the directory, so we can't collect a list of filenames, etc., so we can't do any size-fitting. */ int -xpm_closest_to(dirname, size, ext) - char *dirname; - int size; - char *ext; +xpm_closest_to (char *dirname, int size, char *ext) { fprintf(stderr, _("\ Warning: No DIR structure found on this system --\n\ Unable to autosize for XPM/XIM pieces.\n\ - Please report this error to frankm@hiwaay.net.\n\ - Include system type & operating system in message.\n")); + Please report this error to %s.\n\ + Include system type & operating system in message.\n"), PACKAGE_BUGREPORT);); return size; } #endif /* HAVE_DIR_STRUCT */ @@ -1274,9 +1304,7 @@ TextColors textColors[(int)NColorClasses]; /* String is: "fg, bg, attr". Which is 0, 1, 2 */ static int -parse_color(str, which) - char *str; - int which; +parse_color (char *str, int which) { char *p, buf[100], *d; int i; @@ -1322,9 +1350,7 @@ parse_color(str, which) } static int -parse_cpair(cc, str) - ColorClass cc; - char *str; +parse_cpair (ColorClass cc, char *str) { if ((textColors[(int)cc].fg=parse_color(str, 0)) == -2) { fprintf(stderr, _("%s: can't parse foreground color in `%s'\n"), @@ -1344,7 +1370,7 @@ parse_cpair(cc, str) /* Arrange to catch delete-window events */ Atom wm_delete_window; void -CatchDeleteWindow(Widget w, String procname) +CatchDeleteWindow (Widget w, String procname) { char buf[MSG_SIZ]; XSetWMProtocols(xDisplay, XtWindow(w), &wm_delete_window, 1); @@ -1353,7 +1379,7 @@ CatchDeleteWindow(Widget w, String procname) } void -BoardToTop() +BoardToTop () { Arg args[16]; XtSetArg(args[0], XtNiconic, False); @@ -1407,11 +1433,11 @@ colorVariable[] = { // [HGM] font: keep a font for each square size, even non-stndard ones #define NUM_SIZES 18 #define MAX_SIZE 130 -Boolean fontSet[NUM_FONTS], fontValid[NUM_FONTS][MAX_SIZE]; +Boolean fontIsSet[NUM_FONTS], fontValid[NUM_FONTS][MAX_SIZE]; char *fontTable[NUM_FONTS][MAX_SIZE]; void -ParseFont(char *name, int number) +ParseFont (char *name, int number) { // in XBoard, only 2 of the fonts are currently implemented, and we just copy their name int size; if(sscanf(name, "size%d:", &size)) { @@ -1436,11 +1462,11 @@ ParseFont(char *name, int number) default: return; } - fontSet[number] = True; // [HGM] font: indicate a font was specified (not from settings file) + fontIsSet[number] = True; // [HGM] font: indicate a font was specified (not from settings file) } void -SetFontDefaults() +SetFontDefaults () { // only 2 fonts currently appData.clockFont = CLOCK_FONT_NAME; appData.coordFont = COORD_FONT_NAME; @@ -1448,41 +1474,41 @@ SetFontDefaults() } void -CreateFonts() +CreateFonts () { // no-op, until we identify the code for this already in XBoard and move it here } void -ParseColor(int n, char *name) +ParseColor (int n, char *name) { // in XBoard, just copy the color-name string if(colorVariable[n]) *(char**)colorVariable[n] = strdup(name); } void -ParseTextAttribs(ColorClass cc, char *s) +ParseTextAttribs (ColorClass cc, char *s) { (&appData.colorShout)[cc] = strdup(s); } void -ParseBoardSize(void *addr, char *name) +ParseBoardSize (void *addr, char *name) { appData.boardSize = strdup(name); } void -LoadAllSounds() +LoadAllSounds () { // In XBoard the sound-playing program takes care of obtaining the actual sound } void -SetCommPortDefaults() +SetCommPortDefaults () { // for now, this is a no-op, as the corresponding option does not exist in XBoard } // [HGM] args: these three cases taken out to stay in front-end void -SaveFontArg(FILE *f, ArgDescriptor *ad) +SaveFontArg (FILE *f, ArgDescriptor *ad) { char *name; int i, n = (int)(intptr_t)ad->argLoc; @@ -1506,69 +1532,70 @@ SaveFontArg(FILE *f, ArgDescriptor *ad) break; } for(i=0; iargName, i, fontTable[n][i]); + fprintf(f, OPTCHAR "%s" SEPCHAR "\"size%d:%s\"\n", ad->argName, i, fontTable[n][i]); } void -ExportSounds() +ExportSounds () { // nothing to do, as the sounds are at all times represented by their text-string names already } void -SaveAttribsArg(FILE *f, ArgDescriptor *ad) +SaveAttribsArg (FILE *f, ArgDescriptor *ad) { // here the "argLoc" defines a table index. It could have contained the 'ta' pointer itself, though fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", ad->argName, (&appData.colorShout)[(int)(intptr_t)ad->argLoc]); } void -SaveColor(FILE *f, ArgDescriptor *ad) +SaveColor (FILE *f, ArgDescriptor *ad) { // in WinBoard the color is an int and has to be converted to text. In X it would be a string already? if(colorVariable[(int)(intptr_t)ad->argLoc]) fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", ad->argName, *(char**)colorVariable[(int)(intptr_t)ad->argLoc]); } void -SaveBoardSize(FILE *f, char *name, void *addr) +SaveBoardSize (FILE *f, char *name, void *addr) { // wrapper to shield back-end from BoardSize & sizeInfo fprintf(f, OPTCHAR "%s" SEPCHAR "%s\n", name, appData.boardSize); } void -ParseCommPortSettings(char *s) +ParseCommPortSettings (char *s) { // no such option in XBoard (yet) } extern Widget engineOutputShell; +int frameX, frameY; void -GetActualPlacement(Widget wg, WindowPlacement *wp) +GetActualPlacement (Widget wg, WindowPlacement *wp) { Arg args[16]; Dimension w, h; Position x, y; - int i; + XWindowAttributes winAt; + Window win, dummy; + int i, rx, ry; if(!wg) return; - i = 0; - XtSetArg(args[i], XtNx, &x); i++; - XtSetArg(args[i], XtNy, &y); i++; - XtSetArg(args[i], XtNwidth, &w); i++; - XtSetArg(args[i], XtNheight, &h); i++; - XtGetValues(wg, args, i); - wp->x = x - 4; - wp->y = y - 23; - wp->height = h; - wp->width = w; + win = XtWindow(wg); + XGetWindowAttributes(xDisplay, win, &winAt); // this works, where XtGetValues on XtNx, XtNy does not! + XTranslateCoordinates (xDisplay, win, winAt.root, -winAt.border_width, -winAt.border_width, &rx, &ry, &dummy); + wp->x = rx - winAt.x; + wp->y = ry - winAt.y; + wp->height = winAt.height; + wp->width = winAt.width; + frameX = winAt.x; frameY = winAt.y; // remember to decide if windows touch } void -GetWindowCoords() +GetWindowCoords () { // wrapper to shield use of window handles from back-end (make addressible by number?) // In XBoard this will have to wait until awareness of window parameters is implemented GetActualPlacement(shellWidget, &wpMain); - if(EngineOutputIsUp()) GetActualPlacement(engineOutputShell, &wpEngineOutput); else - if(MoveHistoryIsUp()) GetActualPlacement(historyShell, &wpMoveHistory); + if(EngineOutputIsUp()) GetActualPlacement(engineOutputShell, &wpEngineOutput); + if(MoveHistoryIsUp()) GetActualPlacement(shells[7], &wpMoveHistory); if(EvalGraphIsUp()) GetActualPlacement(evalGraphShell, &wpEvalGraph); if(GameListIsUp()) GetActualPlacement(gameListShell, &wpGameList); if(shellUp[1]) GetActualPlacement(shells[1], &wpComment); @@ -1576,12 +1603,12 @@ GetWindowCoords() } void -PrintCommPortSettings(FILE *f, char *name) +PrintCommPortSettings (FILE *f, char *name) { // This option does not exist in XBoard } int -MySearchPath(char *installDir, char *name, char *fullname) +MySearchPath (char *installDir, char *name, char *fullname) { // just append installDir and name. Perhaps ExpandPath should be used here? name = ExpandPathName(name); if(name && name[0] == '/') @@ -1593,7 +1620,7 @@ MySearchPath(char *installDir, char *name, char *fullname) } int -MyGetFullPathName(char *name, char *fullname) +MyGetFullPathName (char *name, char *fullname) { // should use ExpandPath? name = ExpandPathName(name); safeStrCpy(fullname, name, MSG_SIZ ); @@ -1601,24 +1628,24 @@ MyGetFullPathName(char *name, char *fullname) } void -EnsureOnScreen(int *x, int *y, int minX, int minY) +EnsureOnScreen (int *x, int *y, int minX, int minY) { return; } int -MainWindowUp() +MainWindowUp () { // [HGM] args: allows testing if main window is realized from back-end return xBoardWindow != 0; } void -PopUpStartupDialog() +PopUpStartupDialog () { // start menu not implemented in XBoard } char * -ConvertToLine(int argc, char **argv) +ConvertToLine (int argc, char **argv) { static char line[128*1024], buf[1024]; int i; @@ -1626,7 +1653,7 @@ ConvertToLine(int argc, char **argv) line[0] = NULLCHAR; for(i=1; i= 0) lineGap = appData.overrideLineGap; + boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap); + boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap); + + if(boardWidth != oldWidth || boardHeight != oldHeight || oldDual != twoBoards) { // do resizing stuff only if size actually changed /* * Enable shell resizing. */ @@ -1669,9 +1705,7 @@ void InitDrawingSizes(BoardSize boardSize, int flags) XtSetArg(args[0], XtNdefaultDistance, &sep); XtGetValues(formWidget, args, 1); - if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap; - boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap); - boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap); + oldWidth = boardWidth; oldHeight = boardHeight; oldDual = twoBoards; CreateGrid(); hOffset = boardWidth + 10; for(i=0; i BOARD_FILES || appData.NrRanks > BOARD_RANKS ) @@ -2059,11 +2133,11 @@ main(argc, argv) tinyLayout = szd->tinyLayout; // [HGM] font: use defaults from settings file if available and not overruled } - if(!fontSet[CLOCK_FONT] && fontValid[CLOCK_FONT][squareSize]) + if(!fontIsSet[CLOCK_FONT] && fontValid[CLOCK_FONT][squareSize]) appData.clockFont = fontTable[CLOCK_FONT][squareSize]; - if(!fontSet[MESSAGE_FONT] && fontValid[MESSAGE_FONT][squareSize]) + if(!fontIsSet[MESSAGE_FONT] && fontValid[MESSAGE_FONT][squareSize]) appData.font = fontTable[MESSAGE_FONT][squareSize]; - if(!fontSet[COORD_FONT] && fontValid[COORD_FONT][squareSize]) + if(!fontIsSet[COORD_FONT] && fontValid[COORD_FONT][squareSize]) appData.coordFont = fontTable[COORD_FONT][squareSize]; /* Now, using squareSize as a hint, find a good XPM/XIM set size */ @@ -2109,19 +2183,45 @@ XBoard square size (hint): %d\n\ /* * Determine what fonts to use. */ +#if ENABLE_NLS + appData.font = InsertPxlSize(appData.font, fontPxlSize); + appData.clockFont = InsertPxlSize(appData.clockFont, clockFontPxlSize); + appData.coordFont = InsertPxlSize(appData.coordFont, coordFontPxlSize); + fontSet = CreateFontSet(appData.font); + clockFontSet = CreateFontSet(appData.clockFont); + { + /* For the coordFont, use the 0th font of the fontset. */ + XFontSet coordFontSet = CreateFontSet(appData.coordFont); + XFontStruct **font_struct_list; + XFontSetExtents *fontSize; + char **font_name_list; + XFontsOfFontSet(coordFontSet, &font_struct_list, &font_name_list); + coordFontID = XLoadFont(xDisplay, font_name_list[0]); + coordFontStruct = XQueryFont(xDisplay, coordFontID); + fontSize = XExtentsOfFontSet(fontSet); // [HGM] figure out how much vertical space font takes + textHeight = fontSize->max_logical_extent.height + 5; // add borderWidth + } +#else + appData.font = FindFont(appData.font, fontPxlSize); appData.clockFont = FindFont(appData.clockFont, clockFontPxlSize); + appData.coordFont = FindFont(appData.coordFont, coordFontPxlSize); clockFontID = XLoadFont(xDisplay, appData.clockFont); clockFontStruct = XQueryFont(xDisplay, clockFontID); - appData.coordFont = FindFont(appData.coordFont, coordFontPxlSize); coordFontID = XLoadFont(xDisplay, appData.coordFont); coordFontStruct = XQueryFont(xDisplay, coordFontID); - appData.font = FindFont(appData.font, fontPxlSize); - countFontID = XLoadFont(xDisplay, appData.coordFont); // [HGM] holdings - countFontStruct = XQueryFont(xDisplay, countFontID); -// appData.font = FindFont(appData.font, fontPxlSize); +#endif + countFontID = coordFontID; // [HGM] holdings + countFontStruct = coordFontStruct; xdb = XtDatabase(xDisplay); +#if ENABLE_NLS + XrmPutLineResource(&xdb, "*international: True"); + vTo.size = sizeof(XFontSet); + vTo.addr = (XtPointer) &fontSet; + XrmPutResource(&xdb, "*fontSet", XtRFontSet, &vTo); +#else XrmPutStringResource(&xdb, "*font", appData.font); +#endif /* * Detect if there are not enough colors available and adapt. @@ -2135,10 +2235,7 @@ XBoard square size (hint): %d\n\ if (forceMono) { fprintf(stderr, _("%s: too few colors available; trying monochrome mode\n"), programName); - - if (appData.bitmapDirectory == NULL || - appData.bitmapDirectory[0] == NULLCHAR) - appData.bitmapDirectory = DEF_BITMAP_DIR; + appData.monoMode = True; } if (appData.lowTimeWarning && !appData.monoMode) { @@ -2185,7 +2282,7 @@ XBoard square size (hint): %d\n\ XtGetValues(formWidget, args, 1); j = 0; - widgetList[j++] = menuBarWidget = CreateMenuBar(menuBar); + widgetList[j++] = menuBarWidget = CreateMenuBar(menuBar, boardWidth); XtSetArg(args[0], XtNtop, XtChainTop); XtSetArg(args[1], XtNbottom, XtChainTop); XtSetArg(args[2], XtNright, XtChainLeft); @@ -2194,7 +2291,11 @@ XBoard square size (hint): %d\n\ widgetList[j++] = whiteTimerWidget = XtCreateWidget("whiteTime", labelWidgetClass, formWidget, timerArgs, XtNumber(timerArgs)); +#if ENABLE_NLS + XtSetArg(args[0], XtNfontSet, clockFontSet); +#else XtSetArg(args[0], XtNfont, clockFontStruct); +#endif XtSetArg(args[1], XtNtop, XtChainTop); XtSetArg(args[2], XtNbottom, XtChainTop); XtSetValues(whiteTimerWidget, args, 3); @@ -2202,7 +2303,11 @@ XBoard square size (hint): %d\n\ widgetList[j++] = blackTimerWidget = XtCreateWidget("blackTime", labelWidgetClass, formWidget, timerArgs, XtNumber(timerArgs)); +#if ENABLE_NLS + XtSetArg(args[0], XtNfontSet, clockFontSet); +#else XtSetArg(args[0], XtNfont, clockFontStruct); +#endif XtSetArg(args[1], XtNtop, XtChainTop); XtSetArg(args[2], XtNbottom, XtChainTop); XtSetValues(blackTimerWidget, args, 3); @@ -2377,6 +2482,7 @@ XBoard square size (hint): %d\n\ programName, gres, w, h, wr, hr); } /* !! end hack */ + if(!textHeight) textHeight = hr; // [HGM] if !NLS textHeight is still undefined, and we grab it from here XtSetArg(args[0], XtNleft, XtChainLeft); // [HGM] glue ends for good run-time sizing XtSetArg(args[1], XtNright, XtChainRight); XtSetValues(messageWidget, args, 2); @@ -2548,19 +2654,7 @@ XBoard square size (hint): %d\n\ CreateGCs(False); CreateGrid(); -#if HAVE_LIBXPM - if (appData.bitmapDirectory[0] != NULLCHAR) { - CreatePieces(); - } else { - CreateXPMPieces(); - CreateXPMBoard(appData.liteBackTextureFile, 1); - CreateXPMBoard(appData.darkBackTextureFile, 0); - } -#else - CreateXIMPieces(); - /* Create regular pieces */ - if (!useImages) CreatePieces(); -#endif + CreateAnyPieces(); CreatePieceMenus(); @@ -2581,6 +2675,10 @@ XBoard square size (hint): %d\n\ XtAddEventHandler(boardWidget, ExposureMask|PointerMotionMask, False, (XtEventHandler) EventProc, NULL); /* end why */ + XtAddEventHandler(formWidget, KeyPressMask, False, + (XtEventHandler) MoveTypeInProc, NULL); + XtAddEventHandler(shellWidget, StructureNotifyMask, False, + (XtEventHandler) EventProc, NULL); /* [AS] Restore layout */ if( wpMoveHistory.visible ) { @@ -2617,15 +2715,18 @@ XBoard square size (hint): %d\n\ } gameInfo.boardWidth = 0; // [HGM] pieces: kludge to ensure InitPosition() calls InitDrawingSizes() InitPosition(TRUE); - XtSetKeyboardFocus(shellWidget, formWidget); +// XtSetKeyboardFocus(shellWidget, formWidget); + XSetInputFocus(xDisplay, XtWindow(formWidget), RevertToPointerRoot, CurrentTime); XtAppMainLoop(appContext); if (appData.debugMode) fclose(debugFP); // [DM] debug return 0; } +static Boolean noEcho; + void -ShutDownFrontEnd() +ShutDownFrontEnd () { if (appData.icsActive && oldICSInteractionTitle != NULL) { DisplayIcsInteractionTitle(oldICSInteractionTitle); @@ -2633,23 +2734,23 @@ ShutDownFrontEnd() if (saveSettingsOnExit) SaveSettings(settingsFileName); unlink(gameCopyFilename); unlink(gamePasteFilename); + if(noEcho) EchoOn(); } -RETSIGTYPE TermSizeSigHandler(int sig) +RETSIGTYPE +TermSizeSigHandler (int sig) { update_ics_width(); } RETSIGTYPE -IntSigHandler(sig) - int sig; +IntSigHandler (int sig) { ExitEvent(sig); } RETSIGTYPE -CmailSigHandler(sig) - int sig; +CmailSigHandler (int sig) { int dummy = 0; int error; @@ -2663,12 +2764,7 @@ CmailSigHandler(sig) } void -CmailSigHandlerCallBack(isr, closure, message, count, error) - InputSourceRef isr; - VOIDSTAR closure; - char *message; - int count; - int error; +CmailSigHandlerCallBack (InputSourceRef isr, VOIDSTAR closure, char *message, int count, int error) { BoardToTop(); ReloadCmailMsgEvent(TRUE); /* Reload cmail msg */ @@ -2677,7 +2773,7 @@ CmailSigHandlerCallBack(isr, closure, message, count, error) void -ICSInitScript() +ICSInitScript () { /* try to open the icsLogon script, either in the location given * or in the users HOME directory @@ -2709,7 +2805,7 @@ ICSInitScript() } void -ResetFrontEnd() +ResetFrontEnd () { CommentPopDown(); TagsPopDown(); @@ -2722,8 +2818,7 @@ typedef struct { } Enables; void -GreyRevert(grey) - Boolean grey; +GreyRevert (Boolean grey) { Widget w; if (!menuBarWidget) return; @@ -2742,8 +2837,7 @@ GreyRevert(grey) } void -SetMenuEnables(enab) - Enables *enab; +SetMenuEnables (Enables *enab) { Widget w; if (!menuBarWidget) return; @@ -2776,10 +2870,12 @@ Enables icsEnables[] = { { "menuOptions.Hide Thinking", False }, { "menuOptions.Ponder Next Move", False }, #endif - { "menuEngine.Engine #1 Settings", False }, #endif + { "menuEngine.Engine #1 Settings", False }, { "menuEngine.Engine #2 Settings", False }, + { "menuEngine.Load Engine", False }, { "menuEdit.Annotate", False }, + { "menuOptions.Match", False }, { NULL, False } }; @@ -2838,6 +2934,20 @@ Enables gnuEnables[] = { { "menuFile.Mail Move", False }, { "menuFile.Reload CMail Message", False }, + // [HGM] The following have been added to make a switch from ncp to GNU mode possible + { "menuMode.Machine White", True }, + { "menuMode.Machine Black", True }, + { "menuMode.Analysis Mode", True }, + { "menuMode.Analyze File", True }, + { "menuMode.Two Machines", True }, + { "menuMode.Machine Match", True }, + { "menuEngine.Engine #1 Settings", True }, + { "menuEngine.Engine #2 Settings", True }, + { "menuEngine.Hint", True }, + { "menuEngine.Book", True }, + { "menuEngine.Move Now", True }, + { "menuEngine.Retract Move", True }, + { "Action", True }, { NULL, False } }; @@ -2892,7 +3002,7 @@ Enables machineThinkingEnables[] = { { "menuMode.Machine White", False }, { "menuMode.Machine Black", False }, { "menuMode.Two Machines", False }, - { "menuMode.Machine Match", False }, +// { "menuMode.Machine Match", False }, { "menuEngine.Retract Move", False }, { NULL, False } }; @@ -2911,41 +3021,44 @@ Enables userThinkingEnables[] = { { "menuMode.Machine White", True }, { "menuMode.Machine Black", True }, { "menuMode.Two Machines", True }, - { "menuMode.Machine Match", True }, +// { "menuMode.Machine Match", True }, { "menuEngine.Retract Move", True }, { NULL, False } }; -void SetICSMode() +void +SetICSMode () { SetMenuEnables(icsEnables); #if ZIPPY - if (appData.zippyPlay && !appData.noChessProgram) /* [DM] icsEngineAnalyze */ + if (appData.zippyPlay && !appData.noChessProgram) { /* [DM] icsEngineAnalyze */ XtSetSensitive(XtNameToWidget(menuBarWidget, "menuMode.Analysis Mode"), True); + XtSetSensitive(XtNameToWidget(menuBarWidget, "menuEngine.Engine #1 Settings"), True); + } #endif } void -SetNCPMode() +SetNCPMode () { SetMenuEnables(ncpEnables); } void -SetGNUMode() +SetGNUMode () { SetMenuEnables(gnuEnables); } void -SetCmailMode() +SetCmailMode () { SetMenuEnables(cmailEnables); } void -SetTrainingModeOn() +SetTrainingModeOn () { SetMenuEnables(trainingOnEnables); if (appData.showButtonBar) { @@ -2955,7 +3068,7 @@ SetTrainingModeOn() } void -SetTrainingModeOff() +SetTrainingModeOff () { SetMenuEnables(trainingOffEnables); if (appData.showButtonBar) { @@ -2964,14 +3077,14 @@ SetTrainingModeOff() } void -SetUserThinkingEnables() +SetUserThinkingEnables () { if (appData.noChessProgram) return; SetMenuEnables(userThinkingEnables); } void -SetMachineThinkingEnables() +SetMachineThinkingEnables () { if (appData.noChessProgram) return; SetMenuEnables(machineThinkingEnables); @@ -2993,7 +3106,7 @@ static char *history[HISTORY_SIZE]; int histIn = 0, histP = 0; void -SaveInHistory(char *cmd) +SaveInHistory (char *cmd) { if (history[histIn] != NULL) { free(history[histIn]); @@ -3010,7 +3123,7 @@ SaveInHistory(char *cmd) } char * -PrevInHistory(char *cmd) +PrevInHistory (char *cmd) { int newhp; if (histP == histIn) { @@ -3024,7 +3137,7 @@ PrevInHistory(char *cmd) } char * -NextInHistory() +NextInHistory () { if (histP == histIn) return NULL; histP = (histP + 1) % HISTORY_SIZE; @@ -3034,6 +3147,93 @@ NextInHistory() #define Abs(n) ((n)<0 ? -(n) : (n)) +#ifdef ENABLE_NLS +char * +InsertPxlSize (char *pattern, int targetPxlSize) +{ + char *base_fnt_lst, strInt[12], *p, *q; + int alternatives, i, len, strIntLen; + + /* + * Replace the "*" (if present) in the pixel-size slot of each + * alternative with the targetPxlSize. + */ + p = pattern; + alternatives = 1; + while ((p = strchr(p, ',')) != NULL) { + alternatives++; + p++; + } + snprintf(strInt, sizeof(strInt), "%d", targetPxlSize); + strIntLen = strlen(strInt); + base_fnt_lst = calloc(1, strlen(pattern) + strIntLen * alternatives + 1); + + p = pattern; + q = base_fnt_lst; + while (alternatives--) { + char *comma = strchr(p, ','); + for (i=0; i<14; i++) { + char *hyphen = strchr(p, '-'); + if (!hyphen) break; + if (comma && hyphen > comma) break; + len = hyphen + 1 - p; + if (i == 7 && *p == '*' && len == 2) { + p += len; + memcpy(q, strInt, strIntLen); + q += strIntLen; + *q++ = '-'; + } else { + memcpy(q, p, len); + p += len; + q += len; + } + } + if (!comma) break; + len = comma + 1 - p; + memcpy(q, p, len); + p += len; + q += len; + } + strcpy(q, p); + + return base_fnt_lst; +} + +XFontSet +CreateFontSet (char *base_fnt_lst) +{ + XFontSet fntSet; + char **missing_list; + int missing_count; + char *def_string; + + fntSet = XCreateFontSet(xDisplay, base_fnt_lst, + &missing_list, &missing_count, &def_string); + if (appData.debugMode) { + int i, count; + XFontStruct **font_struct_list; + char **font_name_list; + fprintf(debugFP, "Requested font set for list %s\n", base_fnt_lst); + if (fntSet) { + fprintf(debugFP, " got list %s, locale %s\n", + XBaseFontNameListOfFontSet(fntSet), + XLocaleOfFontSet(fntSet)); + count = XFontsOfFontSet(fntSet, &font_struct_list, &font_name_list); + for (i = 0; i < count; i++) { + fprintf(debugFP, " got charset %s\n", font_name_list[i]); + } + } + for (i = 0; i < missing_count; i++) { + fprintf(debugFP, " missing charset %s\n", missing_list[i]); + } + } + if (fntSet == NULL) { + fprintf(stderr, _("Unable to create font set for %s.\n"), base_fnt_lst); + exit(2); + } + return fntSet; +} +#else // not ENABLE_NLS /* * Find a font that matches "pattern" that is as close as * possible to the targetPxlSize. Prefer fonts that are k @@ -3044,46 +3244,17 @@ NextInHistory() * longer needed. */ char * -FindFont(pattern, targetPxlSize) - char *pattern; - int targetPxlSize; +FindFont (char *pattern, int targetPxlSize) { char **fonts, *p, *best, *scalable, *scalableTail; int i, j, nfonts, minerr, err, pxlSize; -#ifdef ENABLE_NLS - char **missing_list; - int missing_count; - char *def_string, *base_fnt_lst, strInt[3]; - XFontSet fntSet; - XFontStruct **fnt_list; - - base_fnt_lst = calloc(1, strlen(pattern) + 3); - snprintf(strInt, sizeof(strInt)/sizeof(strInt[0]), "%d", targetPxlSize); - p = strstr(pattern, "--"); - strncpy(base_fnt_lst, pattern, p - pattern + 2); - strcat(base_fnt_lst, strInt); - strcat(base_fnt_lst, strchr(p + 2, '-')); - - if ((fntSet = XCreateFontSet(xDisplay, - base_fnt_lst, - &missing_list, - &missing_count, - &def_string)) == NULL) { - - fprintf(stderr, _("Unable to create font set.\n")); - exit (2); - } - - nfonts = XFontsOfFontSet(fntSet, &fnt_list, &fonts); -#else fonts = XListFonts(xDisplay, pattern, 999999, &nfonts); if (nfonts < 1) { fprintf(stderr, _("%s: no fonts match pattern %s\n"), programName, pattern); exit(2); } -#endif best = fonts[0]; scalable = NULL; @@ -3125,17 +3296,13 @@ FindFont(pattern, targetPxlSize) fprintf(debugFP, _("resolved %s at pixel size %d\n to %s\n"), pattern, targetPxlSize, p); } -#ifdef ENABLE_NLS - if (missing_count > 0) - XFreeStringList(missing_list); - XFreeFontSet(xDisplay, fntSet); -#else - XFreeFontNames(fonts); -#endif + XFreeFontNames(fonts); return p; } +#endif -void DeleteGCs() +void +DeleteGCs () { // [HGM] deletes GCs that are to be remade, to prevent resource leak; // must be called before all non-first callse to CreateGCs() XtReleaseGC(shellWidget, highlineGC); @@ -3160,7 +3327,8 @@ void DeleteGCs() } } -void CreateGCs(int redo) +void +CreateGCs (int redo) { XtGCMask value_mask = GCLineWidth | GCLineStyle | GCForeground | GCBackground | GCFunction | GCPlaneMask; @@ -3265,12 +3433,8 @@ void CreateGCs(int redo) } } -void loadXIM(xim, xmask, filename, dest, mask) - XImage *xim; - XImage *xmask; - char *filename; - Pixmap *dest; - Pixmap *mask; +void +loadXIM (XImage *xim, XImage *xmask, char *filename, Pixmap *dest, Pixmap *mask) { int x, y, w, h, p; FILE *fp; @@ -3353,7 +3517,8 @@ void loadXIM(xim, xmask, filename, dest, mask) char pieceBitmapNames[] = "pnbrqfeacwmohijgdvlsukpnsl"; -void CreateXIMPieces() +void +CreateXIMPieces () { int piece, kind; char buf[MSG_SIZ]; @@ -3441,17 +3606,19 @@ void CreateXIMPieces() static VariantClass oldVariant = (VariantClass) -1; // [HGM] pieces: redo every time variant changes #if HAVE_LIBXPM -void CreateXPMBoard(char *s, int kind) +void +CreateXPMBoard (char *s, int kind) { XpmAttributes attr; attr.valuemask = 0; - if(s == NULL || *s == 0 || *s == '*') { useTexture &= ~(kind+1); return; } + if(!appData.useBitmaps || s == NULL || *s == 0 || *s == '*') { useTexture &= ~(kind+1); return; } if (XpmReadFileToPixmap(xDisplay, xBoardWindow, s, &(xpmBoardBitmap[kind]), NULL, &attr) == 0) { useTexture |= kind + 1; textureW[kind] = attr.width; textureH[kind] = attr.height; } } -void FreeXPMPieces() +void +FreeXPMPieces () { // [HGM] to prevent resoucre leak on calling CreaeXPMPieces() a second time, // thisroutine has to be called t free the old piece pixmaps int piece, kind; @@ -3463,7 +3630,8 @@ void FreeXPMPieces() } } -void CreateXPMPieces() +void +CreateXPMPieces () { int piece, kind, r; char buf[MSG_SIZ]; @@ -3631,7 +3799,8 @@ void CreatePieces() } #else /* With built-in bitmaps */ -void CreatePieces() +void +CreatePieces () { BuiltInBits* bib = builtInBits; int piece, kind; @@ -3660,11 +3829,8 @@ void CreatePieces() } #endif -void ReadBitmap(pm, name, bits, wreq, hreq) - Pixmap *pm; - String name; - unsigned char bits[]; - u_int wreq, hreq; +void +ReadBitmap (Pixmap *pm, String name, unsigned char bits[], u_int wreq, u_int hreq) { int x_hot, y_hot; u_int w, h; @@ -3711,7 +3877,8 @@ void ReadBitmap(pm, name, bits, wreq, hreq) } } -void CreateGrid() +void +CreateGrid () { int i, j; @@ -3736,20 +3903,49 @@ void CreateGrid() } } -static void MenuBarSelect(w, addr, index) - Widget w; - caddr_t addr; - caddr_t index; +static void +MenuBarSelect (Widget w, caddr_t addr, caddr_t index) { XtActionProc proc = (XtActionProc) addr; (proc)(NULL, NULL, NULL, NULL); } -void CreateMenuBarPopup(parent, name, mb) - Widget parent; - String name; - Menu *mb; +static void +MenuEngineSelect (Widget w, caddr_t addr, caddr_t index) +{ + RecentEngineEvent((int) (intptr_t) addr); +} + +void +AppendEnginesToMenu (Widget menu, char *list) +{ + int i=0, j; + Widget entry; + MenuItem *mi; + Arg args[16]; + char *p; + + if(appData.icsActive || appData.recentEngines <= 0) return; + recentEngines = strdup(list); + j = 0; + XtSetArg(args[j], XtNleftMargin, 20); j++; + XtSetArg(args[j], XtNrightMargin, 20); j++; + while (*list) { + p = strchr(list, '\n'); if(p == NULL) break; + if(i == 0) XtCreateManagedWidget(_("----"), smeLineObjectClass, menu, args, j); // at least one valid item to add + *p = 0; + XtSetArg(args[j], XtNlabel, XtNewString(list)); + entry = XtCreateManagedWidget("engine", smeBSBObjectClass, menu, args, j+1); + XtAddCallback(entry, XtNcallback, + (XtCallbackProc) MenuEngineSelect, + (caddr_t) (intptr_t) i); + i++; *p = '\n'; list = p + 1; + } +} + +void +CreateMenuBarPopup (Widget parent, String name, Menu *mb) { int j; Widget menu, entry; @@ -3764,10 +3960,10 @@ void CreateMenuBarPopup(parent, name, mb) mi = mb->mi; while (mi->string != NULL) { if (strcmp(mi->string, "----") == 0) { - entry = XtCreateManagedWidget(mi->string, smeLineObjectClass, + entry = XtCreateManagedWidget(_(mi->string), smeLineObjectClass, menu, args, j); } else { - XtSetArg(args[j], XtNlabel, XtNewString(mi->string)); + XtSetArg(args[j], XtNlabel, XtNewString(_(mi->string))); entry = XtCreateManagedWidget(mi->ref, smeBSBObjectClass, menu, args, j+1); XtAddCallback(entry, XtNcallback, @@ -3776,15 +3972,18 @@ void CreateMenuBarPopup(parent, name, mb) } mi++; } + if(!strcmp(mb->name, "Engine")) AppendEnginesToMenu(menu, appData.recentEngineList); } -Widget CreateMenuBar(mb) - Menu *mb; +Widget +CreateMenuBar (Menu *mb, int boardWidth) { - int j; - Widget anchor, menuBar; + int i, j, nr = 0, wtot = 0, widths[10]; + Widget menuBar; Arg args[16]; char menuName[MSG_SIZ]; + Dimension w; + Menu *ma = mb; j = 0; XtSetArg(args[j], XtNorientation, XtorientHorizontal); j++; @@ -3798,27 +3997,33 @@ Widget CreateMenuBar(mb) strncat(menuName, mb->ref, MSG_SIZ - strlen(menuName) - 1); j = 0; XtSetArg(args[j], XtNmenuName, XtNewString(menuName)); j++; - if (tinyLayout) { - char shortName[2]; - shortName[0] = mb->name[0]; - shortName[1] = NULLCHAR; - XtSetArg(args[j], XtNlabel, XtNewString(shortName)); j++; - } - else { - XtSetArg(args[j], XtNlabel, XtNewString(mb->name)); j++; - } - + XtSetArg(args[j], XtNlabel, XtNewString(_(mb->name))); j++; XtSetArg(args[j], XtNborderWidth, 0); j++; - anchor = XtCreateManagedWidget(mb->name, menuButtonWidgetClass, + mb->subMenu = XtCreateManagedWidget(mb->name, menuButtonWidgetClass, menuBar, args, j); CreateMenuBarPopup(menuBar, menuName, mb); + j = 0; + XtSetArg(args[j], XtNwidth, &w); j++; + XtGetValues(mb->subMenu, args, j); + wtot += mb->textWidth = widths[nr++] = w; mb++; } + while(wtot > boardWidth - 40) { + int wmax=0, imax=0; + for(i=0; i wmax) wmax = widths[imax=i]; + widths[imax]--; + wtot--; + } + for(i=0; itype == ButtonRelease) menuNr = RightClick(Release, event->xbutton.x, event->xbutton.y, &pmFromX, &pmFromY); @@ -3969,39 +4171,31 @@ void PieceMenuPopup(w, event, params, num_params) XtPopupSpringLoaded(XtNameToWidget(boardWidget, whichMenu)); } -static void PieceMenuSelect(w, piece, junk) - Widget w; - ChessSquare piece; - caddr_t junk; +static void +PieceMenuSelect (Widget w, ChessSquare piece, caddr_t junk) { if (pmFromX < 0 || pmFromY < 0) return; EditPositionMenuEvent(piece, pmFromX, pmFromY); } -static void DropMenuSelect(w, piece, junk) - Widget w; - ChessSquare piece; - caddr_t junk; +static void +DropMenuSelect (Widget w, ChessSquare piece, caddr_t junk) { if (pmFromX < 0 || pmFromY < 0) return; DropMenuEvent(piece, pmFromX, pmFromY); } -void WhiteClock(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +WhiteClock (Widget w, XEvent *event, String *prms, Cardinal *nprms) { + shiftKey = prms[0][0] & 1; ClockClick(0); } -void BlackClock(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +BlackClock (Widget w, XEvent *event, String *prms, Cardinal *nprms) { + shiftKey = prms[0][0] & 1; ClockClick(1); } @@ -4010,8 +4204,8 @@ void BlackClock(w, event, prms, nprms) * If the user selects on a border boundary, return -1; if off the board, * return -2. Otherwise map the event coordinate to the square. */ -int EventToSquare(x, limit) - int x; +int +EventToSquare (int x, int limit) { if (x <= 0) return -2; @@ -4026,15 +4220,14 @@ int EventToSquare(x, limit) return x; } -static void do_flash_delay(msec) - unsigned long msec; +static void +do_flash_delay (unsigned long msec) { TimeDelay(msec); } -static void drawHighlight(file, rank, gc) - int file, rank; - GC gc; +static void +drawHighlight (int file, int rank, GC gc) { int x, y; @@ -4058,8 +4251,7 @@ int hi1X = -1, hi1Y = -1, hi2X = -1, hi2Y = -1; int pm1X = -1, pm1Y = -1, pm2X = -1, pm2Y = -1; void -SetHighlights(fromX, fromY, toX, toY) - int fromX, fromY, toX, toY; +SetHighlights (int fromX, int fromY, int toX, int toY) { if (hi1X != fromX || hi1Y != fromY) { if (hi1X >= 0 && hi1Y >= 0) { @@ -4081,6 +4273,8 @@ SetHighlights(fromX, fromY, toX, toY) drawHighlight(toX, toY, highlineGC); } } + if(toX<0) // clearing the highlights must have damaged arrow + DrawArrowHighlight(hi1X, hi1Y, hi2X, hi2Y); // for now, redraw it (should really be cleared!) hi1X = fromX; hi1Y = fromY; hi2X = toX; @@ -4088,15 +4282,14 @@ SetHighlights(fromX, fromY, toX, toY) } void -ClearHighlights() +ClearHighlights () { SetHighlights(-1, -1, -1, -1); } void -SetPremoveHighlights(fromX, fromY, toX, toY) - int fromX, fromY, toX, toY; +SetPremoveHighlights (int fromX, int fromY, int toX, int toY) { if (pm1X != fromX || pm1Y != fromY) { if (pm1X >= 0 && pm1Y >= 0) { @@ -4121,13 +4314,13 @@ SetPremoveHighlights(fromX, fromY, toX, toY) } void -ClearPremoveHighlights() +ClearPremoveHighlights () { SetPremoveHighlights(-1, -1, -1, -1); } -static int CutOutSquare(x, y, x0, y0, kind) - int x, y, *x0, *y0, kind; +static int +CutOutSquare (int x, int y, int *x0, int *y0, int kind) { int W = BOARD_WIDTH, H = BOARD_HEIGHT; int nx = x/(squareSize + lineGap), ny = y/(squareSize + lineGap); @@ -4144,10 +4337,8 @@ static int CutOutSquare(x, y, x0, y0, kind) return 1; } -static void BlankSquare(x, y, color, piece, dest, fac) - int x, y, color, fac; - ChessSquare piece; - Drawable dest; +static void +BlankSquare (int x, int y, int color, ChessSquare piece, Drawable dest, int fac) { // [HGM] extra param 'fac' for forcing destination to (0,0) for copying to animation buffer int x0, y0; if (useImages && color != 2 && (useTexture & color+1) && CutOutSquare(x, y, &x0, &y0, color)) { @@ -4192,10 +4383,8 @@ static void BlankSquare(x, y, color, piece, dest, fac) I split out the routines to draw a piece so that I could make a generic flash routine. */ -static void monoDrawPiece_1bit(piece, square_color, x, y, dest) - ChessSquare piece; - int square_color, x, y; - Drawable dest; +static void +monoDrawPiece_1bit (ChessSquare piece, int square_color, int x, int y, Drawable dest) { /* Avoid XCopyPlane on 1-bit screens to work around Sun bug */ switch (square_color) { @@ -4218,10 +4407,8 @@ static void monoDrawPiece_1bit(piece, square_color, x, y, dest) } } -static void monoDrawPiece(piece, square_color, x, y, dest) - ChessSquare piece; - int square_color, x, y; - Drawable dest; +static void +monoDrawPiece (ChessSquare piece, int square_color, int x, int y, Drawable dest) { switch (square_color) { case 1: /* light */ @@ -4243,10 +4430,8 @@ static void monoDrawPiece(piece, square_color, x, y, dest) } } -static void colorDrawPiece(piece, square_color, x, y, dest) - ChessSquare piece; - int square_color, x, y; - Drawable dest; +static void +colorDrawPiece (ChessSquare piece, int square_color, int x, int y, Drawable dest) { if(pieceToSolid(piece) == NULL) return; // [HGM] bitmaps: make it non-fatal if we have no bitmap; switch (square_color) { @@ -4272,10 +4457,8 @@ static void colorDrawPiece(piece, square_color, x, y, dest) } } -static void colorDrawPieceImage(piece, square_color, x, y, dest) - ChessSquare piece; - int square_color, x, y; - Drawable dest; +static void +colorDrawPieceImage (ChessSquare piece, int square_color, int x, int y, Drawable dest) { int kind, p = piece; @@ -4315,7 +4498,8 @@ static void colorDrawPieceImage(piece, square_color, x, y, dest) typedef void (*DrawFunc)(); -DrawFunc ChooseDrawFunc() +DrawFunc +ChooseDrawFunc () { if (appData.monoMode) { if (DefaultDepth(xDisplay, xScreen) == 1) { @@ -4332,8 +4516,8 @@ DrawFunc ChooseDrawFunc() } /* [HR] determine square color depending on chess variant. */ -static int SquareColor(row, column) - int row, column; +static int +SquareColor (int row, int column) { int square_color; @@ -4357,9 +4541,8 @@ static int SquareColor(row, column) return square_color; } -void DrawSquare(row, column, piece, do_flash) - int row, column, do_flash; - ChessSquare piece; +void +DrawSquare (int row, int column, ChessSquare piece, int do_flash) { int square_color, x, y, direction, font_ascent, font_descent; int i; @@ -4469,22 +4652,98 @@ void DrawSquare(row, column, piece, do_flash) } } if(!partnerUp && marker[row][column]) { + if(appData.monoMode) { + XFillArc(xDisplay, xBoardWindow, marker[row][column] == 2 ? darkSquareGC : lightSquareGC, + x + squareSize/4, y+squareSize/4, squareSize/2, squareSize/2, 0, 64*360); + XDrawArc(xDisplay, xBoardWindow, marker[row][column] == 2 ? lightSquareGC : darkSquareGC, + x + squareSize/4, y+squareSize/4, squareSize/2, squareSize/2, 0, 64*360); + } else XFillArc(xDisplay, xBoardWindow, marker[row][column] == 2 ? prelineGC : highlineGC, x + squareSize/4, y+squareSize/4, squareSize/2, squareSize/2, 0, 64*360); } } +double +Fraction (int x, int start, int stop) +{ + double f = ((double) x - start)/(stop - start); + if(f > 1.) f = 1.; else if(f < 0.) f = 0.; + return f; +} + +static WindowPlacement wpNew; + +void +CoDrag (Widget sh, WindowPlacement *wp) +{ + Arg args[16]; + int j=0, touch=0, fudge = 2; + GetActualPlacement(sh, wp); + if(abs(wpMain.x + wpMain.width + 2*frameX - wp->x) < fudge) touch = 1; else // right touch + if(abs(wp->x + wp->width + 2*frameX - wpMain.x) < fudge) touch = 2; else // left touch + if(abs(wpMain.y + wpMain.height + frameX + frameY - wp->y) < fudge) touch = 3; else // bottom touch + if(abs(wp->y + wp->height + frameX + frameY - wpMain.y) < fudge) touch = 4; // top touch + if(!touch ) return; // only windows that touch co-move + if(touch < 3 && wpNew.height != wpMain.height) { // left or right and height changed + int heightInc = wpNew.height - wpMain.height; + double fracTop = Fraction(wp->y, wpMain.y, wpMain.y + wpMain.height + frameX + frameY); + double fracBot = Fraction(wp->y + wp->height + frameX + frameY + 1, wpMain.y, wpMain.y + wpMain.height + frameX + frameY); + wp->y += fracTop * heightInc; + heightInc = (int) (fracBot * heightInc) - (int) (fracTop * heightInc); + if(heightInc) XtSetArg(args[j], XtNheight, wp->height + heightInc), j++; + } else if(touch > 2 && wpNew.width != wpMain.width) { // top or bottom and width changed + int widthInc = wpNew.width - wpMain.width; + double fracLeft = Fraction(wp->x, wpMain.x, wpMain.x + wpMain.width + 2*frameX); + double fracRght = Fraction(wp->x + wp->width + 2*frameX + 1, wpMain.x, wpMain.x + wpMain.width + 2*frameX); + wp->y += fracLeft * widthInc; + widthInc = (int) (fracRght * widthInc) - (int) (fracLeft * widthInc); + if(widthInc) XtSetArg(args[j], XtNwidth, wp->width + widthInc), j++; + } + wp->x += wpNew.x - wpMain.x; + wp->y += wpNew.y - wpMain.y; + if(touch == 1) wp->x += wpNew.width - wpMain.width; else + if(touch == 3) wp->y += wpNew.height - wpMain.height; + XtSetArg(args[j], XtNx, wp->x); j++; + XtSetArg(args[j], XtNy, wp->y); j++; + XtSetValues(sh, args, j); +} + +void +DragProc () +{ + GetActualPlacement(shellWidget, &wpNew); + if(wpNew.x == wpMain.x && wpNew.y == wpMain.y && // not moved + wpNew.width == wpMain.width && wpNew.height == wpMain.height) // not sized + return; // false alarm + if(EngineOutputIsUp()) CoDrag(engineOutputShell, &wpEngineOutput); + if(MoveHistoryIsUp()) CoDrag(shells[7], &wpMoveHistory); + if(EvalGraphIsUp()) CoDrag(evalGraphShell, &wpEvalGraph); + if(GameListIsUp()) CoDrag(gameListShell, &wpGameList); + wpMain = wpNew; + XDrawPosition(boardWidget, True, NULL); +} + + +void +DelayedDrag () +{ + static XtIntervalId delayedDragID = 0; + if(delayedDragID) XtRemoveTimeOut(delayedDragID); // cancel pending + delayedDragID = + XtAppAddTimeOut(appContext, 50, (XtTimerCallbackProc) DragProc, (XtPointer) 0); // and schedule new one 50 msec later +} /* Why is this needed on some versions of X? */ -void EventProc(widget, unused, event) - Widget widget; - caddr_t unused; - XEvent *event; +void +EventProc (Widget widget, caddr_t unused, XEvent *event) { if (!XtIsRealized(widget)) return; - switch (event->type) { + case ConfigureNotify: // main window is being dragged: drag attached windows with it + if(appData.useStickyWindows) + DelayedDrag(); // as long as events keep coming in faster than 50 msec, they destroy each other + break; case Expose: if (event->xexpose.count > 0) return; /* no clipping is done */ XDrawPosition(widget, True, NULL); @@ -4502,17 +4761,16 @@ void EventProc(widget, unused, event) } /* end why */ -void DrawPosition(fullRedraw, board) - /*Boolean*/int fullRedraw; - Board board; +void +DrawPosition (int fullRedraw, Board board) { XDrawPosition(boardWidget, fullRedraw, board); } /* Returns 1 if there are "too many" differences between b1 and b2 (i.e. more than 1 move was made) */ -static int too_many_diffs(b1, b2) - Board b1, b2; +static int +too_many_diffs (Board b1, Board b2) { int i, j; int c = 0; @@ -4545,9 +4803,8 @@ static int castling_matrix[4][5] = { Note: Only handles a max of 1 castling move, so be sure to call too_many_diffs() first. */ -static int check_castle_draw(newb, oldb, rrow, rcol) - Board newb, oldb; - int *rrow, *rcol; +static int +check_castle_draw (Board newb, Board oldb, int *rrow, int *rcol) { int i, *r, j; int match; @@ -4576,22 +4833,26 @@ static int check_castle_draw(newb, oldb, rrow, rcol) } // [HGM] seekgraph: some low-level drawing routines cloned from xevalgraph -void DrawSeekAxis( int x, int y, int xTo, int yTo ) +void +DrawSeekAxis (int x, int y, int xTo, int yTo) { XDrawLine(xDisplay, xBoardWindow, lineGC, x, y, xTo, yTo); } -void DrawSeekBackground( int left, int top, int right, int bottom ) +void +DrawSeekBackground (int left, int top, int right, int bottom) { XFillRectangle(xDisplay, xBoardWindow, lightSquareGC, left, top, right-left, bottom-top); } -void DrawSeekText(char *buf, int x, int y) +void +DrawSeekText (char *buf, int x, int y) { XDrawString(xDisplay, xBoardWindow, coordGC, x, y+4, buf, strlen(buf)); } -void DrawSeekDot(int x, int y, int colorNr) +void +DrawSeekDot (int x, int y, int colorNr) { int square = colorNr & 0x80; GC color; @@ -4610,10 +4871,8 @@ static int damage[2][BOARD_RANKS][BOARD_FILES]; /* * event handler for redrawing the board */ -void XDrawPosition(w, repaint, board) - Widget w; - /*Boolean*/int repaint; - Board board; +void +XDrawPosition (Widget w, int repaint, Board board) { int i, j, do_flash; static int lastFlipView = 0; @@ -4720,11 +4979,8 @@ void XDrawPosition(w, repaint, board) /* * event handler for redrawing the board */ -void DrawPositionProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +DrawPositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { XDrawPosition(w, True, NULL); } @@ -4740,11 +4996,8 @@ void DrawPositionProc(w, event, prms, nprms) // move, (which will weed out the illegal selfcaptures and moves into the holdings, and flag promotions), // and at the end FinishMove() to perform the move after optional promotion popups. // For now I patched it to allow self-capture with King, and suppress clicks between board and holdings. -void HandleUserMove(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +HandleUserMove (Widget w, XEvent *event, String *prms, Cardinal *nprms) { if (w != boardWidget || errorExitStatus != -1) return; if(nprms) shiftKey = !strcmp(prms[0], "1"); @@ -4766,22 +5019,23 @@ void HandleUserMove(w, event, prms, nprms) if(event->type == ButtonRelease) LeftClick(Release, event->xbutton.x, event->xbutton.y); } -void AnimateUserMove (Widget w, XEvent * event, - String * params, Cardinal * nParams) +void +AnimateUserMove (Widget w, XEvent *event, String *params, Cardinal *nParams) { if(!PromoScroll(event->xmotion.x, event->xmotion.y)) DragPieceMove(event->xmotion.x, event->xmotion.y); } -void HandlePV (Widget w, XEvent * event, - String * params, Cardinal * nParams) +void +HandlePV (Widget w, XEvent * event, String * params, Cardinal * nParams) { // [HGM] pv: walk PV MovePV(event->xmotion.x, event->xmotion.y, lineGap + BOARD_HEIGHT * (squareSize + lineGap)); } static int savedIndex; /* gross that this is global */ -void CommentClick (Widget w, XEvent * event, String * params, Cardinal * nParams) +void +CommentClick (Widget w, XEvent * event, String * params, Cardinal * nParams) { String val; XawTextPosition index, dummy; @@ -4795,23 +5049,24 @@ void CommentClick (Widget w, XEvent * event, String * params, Cardinal * nParams LoadVariation( index, val ); // [HGM] also does the actual moving to it, now } -void EditCommentPopUp(index, title, text) - int index; - char *title, *text; +void +EditCommentPopUp (int index, char *title, char *text) { savedIndex = index; if (text == NULL) text = ""; NewCommentPopup(title, text, index); } -void ICSInputBoxPopUp() +void +ICSInputBoxPopUp () { InputBoxPopup(); } extern Option boxOptions[]; -void ICSInputSendText() +void +ICSInputSendText () { Widget edit; int j; @@ -4828,43 +5083,50 @@ void ICSInputSendText() XtCallActionProc(edit, "kill-selection", NULL, NULL, 0); } -void ICSInputBoxPopDown() +void +ICSInputBoxPopDown () { PopDown(4); } -void CommentPopUp(title, text) - char *title, *text; +void +CommentPopUp (char *title, char *text) { savedIndex = currentMove; // [HGM] vari NewCommentPopup(title, text, currentMove); } -void CommentPopDown() +void +CommentPopDown () { PopDown(1); } -void FileNamePopUp(label, def, filter, proc, openMode) - char *label; - char *def; - char *filter; - FileProc proc; - char *openMode; +static char *openName; +FILE *openFP; + +void +DelayedLoad () +{ + (void) (*fileProc)(openFP, 0, openName); +} + +void +FileNamePopUp (char *label, char *def, char *filter, FileProc proc, char *openMode) { fileProc = proc; /* I can't see a way not */ fileOpenMode = openMode; /* to use globals here */ { // [HGM] use file-selector dialog stolen from Ghostview - char *name; int index; // this is not supported yet - FILE *f; - if(f = XsraSelFile(shellWidget, label, NULL, NULL, "could not open: ", - (def[0] ? def : NULL), filter, openMode, NULL, &name)) - (void) (*fileProc)(f, index=0, name); + if(openFP = XsraSelFile(shellWidget, label, NULL, NULL, _("could not open: "), + (def[0] ? def : NULL), filter, openMode, NULL, &openName)) + // [HGM] delay to give expose event opportunity to redraw board after browser-dialog popdown before lengthy load starts + ScheduleDelayedEvent(&DelayedLoad, 50); } } -void FileNamePopDown() +void +FileNamePopDown () { if (!filenameUp) return; XtPopdown(fileNameShell); @@ -4873,9 +5135,8 @@ void FileNamePopDown() ModeHighlight(); } -void FileNameCallback(w, client_data, call_data) - Widget w; - XtPointer client_data, call_data; +void +FileNameCallback (Widget w, XtPointer client_data, XtPointer call_data) { String name; Arg args[16]; @@ -4891,11 +5152,8 @@ void FileNameCallback(w, client_data, call_data) FileNameAction(w, NULL, NULL, NULL); } -void FileNameAction(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +FileNameAction (Widget w, XEvent *event, String *prms, Cardinal *nprms) { char buf[MSG_SIZ]; String name; @@ -4940,13 +5198,15 @@ void FileNameAction(w, event, prms, nprms) ModeHighlight(); } -void PromotionPopUp() +void +PromotionPopUp () { Arg args[16]; Widget dialog, layout; Position x, y; Dimension bw_width, pw_width; int j; + char *PromoChars = "wglcqrbnkac+=\0"; j = 0; XtSetArg(args[j], XtNwidth, &bw_width); j++; @@ -4970,47 +5230,33 @@ void PromotionPopUp() if(gameInfo.variant != VariantShogi) { if(gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove)) { - XawDialogAddButton(dialog, _("Warlord"), PromotionCallback, - (XtPointer) dialog); - XawDialogAddButton(dialog, _("General"), PromotionCallback, - (XtPointer) dialog); - XawDialogAddButton(dialog, _("Lieutenant"), PromotionCallback, - (XtPointer) dialog); - XawDialogAddButton(dialog, _("Captain"), PromotionCallback, - (XtPointer) dialog); - } else { - XawDialogAddButton(dialog, _("Queen"), PromotionCallback, - (XtPointer) dialog); - XawDialogAddButton(dialog, _("Rook"), PromotionCallback, - (XtPointer) dialog); - XawDialogAddButton(dialog, _("Bishop"), PromotionCallback, - (XtPointer) dialog); - XawDialogAddButton(dialog, _("Knight"), PromotionCallback, - (XtPointer) dialog); + XawDialogAddButton(dialog, _("Warlord"), PromotionCallback, PromoChars + 0); + XawDialogAddButton(dialog, _("General"), PromotionCallback, PromoChars + 1); + XawDialogAddButton(dialog, _("Lieutenant"), PromotionCallback, PromoChars + 2); + XawDialogAddButton(dialog, _("Captain"), PromotionCallback, PromoChars + 3); + } else { + XawDialogAddButton(dialog, _("Queen"), PromotionCallback, PromoChars + 4); + XawDialogAddButton(dialog, _("Rook"), PromotionCallback, PromoChars + 5); + XawDialogAddButton(dialog, _("Bishop"), PromotionCallback, PromoChars + 6); + XawDialogAddButton(dialog, _("Knight"), PromotionCallback, PromoChars + 7); } if (!appData.testLegality || gameInfo.variant == VariantSuicide || - gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove) || + gameInfo.variant == VariantSpartan && !WhiteOnMove(currentMove) || gameInfo.variant == VariantGiveaway) { - XawDialogAddButton(dialog, _("King"), PromotionCallback, - (XtPointer) dialog); + XawDialogAddButton(dialog, _("King"), PromotionCallback, PromoChars + 8); } if(gameInfo.variant == VariantCapablanca || gameInfo.variant == VariantGothic || gameInfo.variant == VariantCapaRandom) { - XawDialogAddButton(dialog, _("Archbishop"), PromotionCallback, - (XtPointer) dialog); - XawDialogAddButton(dialog, _("Chancellor"), PromotionCallback, - (XtPointer) dialog); + XawDialogAddButton(dialog, _("Archbishop"), PromotionCallback, PromoChars + 9); + XawDialogAddButton(dialog, _("Chancellor"), PromotionCallback, PromoChars + 10); } } else // [HGM] shogi { - XawDialogAddButton(dialog, _("Promote"), PromotionCallback, - (XtPointer) dialog); - XawDialogAddButton(dialog, _("Defer"), PromotionCallback, - (XtPointer) dialog); + XawDialogAddButton(dialog, _("Promote"), PromotionCallback, PromoChars + 11); + XawDialogAddButton(dialog, _("Defer"), PromotionCallback, PromoChars + 12); } - XawDialogAddButton(dialog, _("cancel"), PromotionCallback, - (XtPointer) dialog); + XawDialogAddButton(dialog, _("cancel"), PromotionCallback, PromoChars + 13); XtRealizeWidget(promotionShell); CatchDeleteWindow(promotionShell, "PromotionPopDown"); @@ -5034,7 +5280,8 @@ void PromotionPopUp() promotionUp = True; } -void PromotionPopDown() +void +PromotionPopDown () { if (!promotionUp) return; XtPopdown(promotionShell); @@ -5042,35 +5289,20 @@ void PromotionPopDown() promotionUp = False; } -void PromotionCallback(w, client_data, call_data) - Widget w; - XtPointer client_data, call_data; +void +PromotionCallback (Widget w, XtPointer client_data, XtPointer call_data) { - String name; - Arg args[16]; - int promoChar; - - XtSetArg(args[0], XtNlabel, &name); - XtGetValues(w, args, 1); + int promoChar = * (const char *) client_data; PromotionPopDown(); if (fromX == -1) return; - if (strcmp(name, _("cancel")) == 0) { + if (! promoChar) { fromX = fromY = -1; ClearHighlights(); return; - } else if (strcmp(name, _("Knight")) == 0) { - promoChar = 'n'; - } else if (strcmp(name, _("Promote")) == 0) { - promoChar = '+'; - } else if (strcmp(name, _("Defer")) == 0) { - promoChar = '='; - } else { - promoChar = ToLower(name[0]); } - UserMoveEvent(fromX, fromY, toX, toY, promoChar); if (!appData.highlightLastMove || gotPremove) ClearHighlights(); @@ -5079,29 +5311,28 @@ void PromotionCallback(w, client_data, call_data) } -void ErrorCallback(w, client_data, call_data) - Widget w; - XtPointer client_data, call_data; +void +ErrorCallback (Widget w, XtPointer client_data, XtPointer call_data) { - errorUp = False; + dialogError = errorUp = False; XtPopdown(w = XtParent(XtParent(XtParent(w)))); XtDestroyWidget(w); if (errorExitStatus != -1) ExitEvent(errorExitStatus); } -void ErrorPopDown() +void +ErrorPopDown () { if (!errorUp) return; - errorUp = False; + dialogError = errorUp = False; XtPopdown(errorShell); XtDestroyWidget(errorShell); if (errorExitStatus != -1) ExitEvent(errorExitStatus); } -void ErrorPopUp(title, label, modal) - char *title, *label; - int modal; +void +ErrorPopUp (char *title, char *label, int modal) { Arg args[16]; Widget dialog, layout; @@ -5117,7 +5348,7 @@ void ErrorPopUp(title, label, modal) XtSetArg(args[i], XtNtitle, title); i++; errorShell = XtCreatePopupShell("errorpopup", transientShellWidgetClass, - shellWidget, args, i); + shellUp[0] ? (dialogError = modal = TRUE, shells[0]) : shellWidget, args, i); layout = XtCreateManagedWidget(layoutName, formWidgetClass, errorShell, layoutArgs, XtNumber(layoutArgs)); @@ -5169,7 +5400,9 @@ void ErrorPopUp(title, label, modal) /* Disable all user input other than deleting the window */ static int frozen = 0; -void FreezeUI() + +void +FreezeUI () { if (frozen) return; /* Grab by a widget that doesn't accept input */ @@ -5178,15 +5411,16 @@ void FreezeUI() } /* Undo a FreezeUI */ -void ThawUI() +void +ThawUI () { if (!frozen) return; XtRemoveGrab(messageWidget); frozen = 0; } -char *ModeToWidgetName(mode) - GameMode mode; +char * +ModeToWidgetName (GameMode mode) { switch (mode) { case BeginningOfGame: @@ -5227,7 +5461,8 @@ char *ModeToWidgetName(mode) } } -void ModeHighlight() +void +ModeHighlight () { Arg args[16]; static int oldPausing = FALSE; @@ -5274,6 +5509,8 @@ void ModeHighlight() XtSetValues(XtNameToWidget(menuBarWidget, wname), args, 1); } oldmode = gameMode; + XtSetArg(args[0], XtNleftBitmap, matchMode && matchGame < appData.matchGames ? xMarkPixmap : None); + XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Machine Match"), args, 1); /* Maybe all the enables should be handled here, not just this one */ XtSetSensitive(XtNameToWidget(menuBarWidget, "menuMode.Training"), @@ -5284,19 +5521,14 @@ void ModeHighlight() /* * Button/menu procedures */ -void ResetProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +ResetProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { ResetGameEvent(); } -int LoadGamePopUp(f, gameNumber, title) - FILE *f; - int gameNumber; - char *title; +int +LoadGamePopUp (FILE *f, int gameNumber, char *title) { cmailMsgLoaded = FALSE; if (gameNumber == 0) { @@ -5314,11 +5546,8 @@ int LoadGamePopUp(f, gameNumber, title) return LoadGame(f, gameNumber, title, FALSE); } -void LoadGameProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +LoadGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) { Reset(FALSE, TRUE); @@ -5326,65 +5555,44 @@ void LoadGameProc(w, event, prms, nprms) FileNamePopUp(_("Load game file name?"), "", ".pgn .game", LoadGamePopUp, "rb"); } -void LoadNextGameProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +LoadNextGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { ReloadGame(1); } -void LoadPrevGameProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +LoadPrevGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { ReloadGame(-1); } -void ReloadGameProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +ReloadGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { ReloadGame(0); } -void LoadNextPositionProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +LoadNextPositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { ReloadPosition(1); } -void LoadPrevPositionProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +LoadPrevPositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { ReloadPosition(-1); } -void ReloadPositionProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +ReloadPositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { ReloadPosition(0); } -void LoadPositionProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +LoadPositionProc(Widget w, XEvent *event, String *prms, Cardinal *nprms) { if (gameMode == AnalyzeMode || gameMode == AnalyzeFile) { Reset(FALSE, TRUE); @@ -5392,11 +5600,8 @@ void LoadPositionProc(w, event, prms, nprms) FileNamePopUp(_("Load position file name?"), "", ".fen .epd .pos", LoadPosition, "rb"); } -void SaveGameProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +SaveGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { FileNamePopUp(_("Save game file name?"), DefaultFileName(appData.oldSaveStyle ? "game" : "pgn"), @@ -5404,11 +5609,8 @@ void SaveGameProc(w, event, prms, nprms) SaveGame, "a"); } -void SavePositionProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +SavePositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { FileNamePopUp(_("Save position file name?"), DefaultFileName(appData.oldSaveStyle ? "pos" : "fen"), @@ -5416,20 +5618,14 @@ void SavePositionProc(w, event, prms, nprms) SavePosition, "a"); } -void ReloadCmailMsgProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +ReloadCmailMsgProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { ReloadCmailMsgEvent(FALSE); } -void MailMoveProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +MailMoveProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { MailMoveEvent(); } @@ -5438,9 +5634,9 @@ void MailMoveProc(w, event, prms, nprms) char *selected_fen_position=NULL; Boolean -SendPositionSelection(Widget w, Atom *selection, Atom *target, - Atom *type_return, XtPointer *value_return, - unsigned long *length_return, int *format_return) +SendPositionSelection (Widget w, Atom *selection, Atom *target, + Atom *type_return, XtPointer *value_return, + unsigned long *length_return, int *format_return) { char *selection_tmp; @@ -5464,11 +5660,19 @@ SendPositionSelection(Widget w, Atom *selection, Atom *target, *value_return = targets_tmp; *type_return = XA_ATOM; *length_return = 2; +#if 0 + // This code leads to a read of value_return out of bounds on 64-bit systems. + // Other code which I have seen always sets *format_return to 32 independent of + // sizeof(Atom) without adjusting *length_return. For instance see TextConvertSelection() + // at http://cgit.freedesktop.org/xorg/lib/libXaw/tree/src/Text.c -- BJ *format_return = 8 * sizeof(Atom); if (*format_return > 32) { *length_return *= *format_return / 32; *format_return = 32; } +#else + *format_return = 32; +#endif return True; } else { return False; @@ -5478,12 +5682,9 @@ SendPositionSelection(Widget w, Atom *selection, Atom *target, /* note: when called from menu all parameters are NULL, so no clue what the * Widget which was clicked on was, or what the click event was */ -void CopyPositionProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; - { +void +CopyPositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) +{ /* * Set both PRIMARY (the selection) and CLIPBOARD, since we don't * have a notion of a position that is selected but not copied. @@ -5503,12 +5704,18 @@ void CopyPositionProc(w, event, prms, nprms) SendPositionSelection, NULL/* lose_ownership_proc */ , NULL/* transfer_done_proc */); - } +} + +void +CopyFENToClipboard () +{ // wrapper to make call from back-end possible + CopyPositionProc(NULL, NULL, NULL, NULL); +} /* function called when the data to Paste is ready */ static void -PastePositionCB(Widget w, XtPointer client_data, Atom *selection, - Atom *type, XtPointer value, unsigned long *len, int *format) +PastePositionCB (Widget w, XtPointer client_data, Atom *selection, + Atom *type, XtPointer value, unsigned long *len, int *format) { char *fenstr=value; if (value==NULL || *len==0) return; /* nothing had been selected to copy */ @@ -5539,9 +5746,9 @@ void PastePositionProc(w, event, prms, nprms) } static Boolean -SendGameSelection(Widget w, Atom *selection, Atom *target, - Atom *type_return, XtPointer *value_return, - unsigned long *length_return, int *format_return) +SendGameSelection (Widget w, Atom *selection, Atom *target, + Atom *type_return, XtPointer *value_return, + unsigned long *length_return, int *format_return) { char *selection_tmp; @@ -5573,21 +5780,28 @@ SendGameSelection(Widget w, Atom *selection, Atom *target, *value_return = targets_tmp; *type_return = XA_ATOM; *length_return = 2; +#if 0 + // This code leads to a read of value_return out of bounds on 64-bit systems. + // Other code which I have seen always sets *format_return to 32 independent of + // sizeof(Atom) without adjusting *length_return. For instance see TextConvertSelection() + // at http://cgit.freedesktop.org/xorg/lib/libXaw/tree/src/Text.c -- BJ *format_return = 8 * sizeof(Atom); if (*format_return > 32) { *length_return *= *format_return / 32; *format_return = 32; } +#else + *format_return = 32; +#endif return True; } else { return False; } } -void CopySomething() +void +CopySomething () { - int ret; - /* * Set both PRIMARY (the selection) and CLIPBOARD, since we don't * have a notion of a game that is selected but not copied. @@ -5608,11 +5822,8 @@ void CopySomething() /* note: when called from menu all parameters are NULL, so no clue what the * Widget which was clicked on was, or what the click event was */ -void CopyGameProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +CopyGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { int ret; @@ -5622,11 +5833,8 @@ void CopyGameProc(w, event, prms, nprms) CopySomething(); } -void CopyGameListProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +CopyGameListProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { if(!SaveGameListAsText(fopen(gameCopyFilename, "w"))) return; CopySomething(); @@ -5634,8 +5842,8 @@ void CopyGameListProc(w, event, prms, nprms) /* function called when the data to Paste is ready */ static void -PasteGameCB(Widget w, XtPointer client_data, Atom *selection, - Atom *type, XtPointer value, unsigned long *len, int *format) +PasteGameCB (Widget w, XtPointer client_data, Atom *selection, + Atom *type, XtPointer value, unsigned long *len, int *format) { FILE* f; if (value == NULL || *len == 0) { @@ -5654,11 +5862,8 @@ PasteGameCB(Widget w, XtPointer client_data, Atom *selection, /* called when Paste Game button is pressed, * all parameters will be NULL */ -void PasteGameProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +PasteGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { XtGetSelectionValue(menuBarWidget, appData.pasteSelection ? XA_PRIMARY: XA_CLIPBOARD(xDisplay), XA_STRING, @@ -5674,54 +5879,39 @@ void PasteGameProc(w, event, prms, nprms) } -void AutoSaveGame() +void +AutoSaveGame () { SaveGameProc(NULL, NULL, NULL, NULL); } -void QuitProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +QuitProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { ExitEvent(0); } -void PauseProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +PauseProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { PauseEvent(); } - -void MachineBlackProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +MachineBlackProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { MachineBlackEvent(); } -void MachineWhiteProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +MachineWhiteProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { MachineWhiteEvent(); } -void AnalyzeModeProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +AnalyzeModeProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { char buf[MSG_SIZ]; @@ -5762,11 +5952,8 @@ void AnalyzeModeProc(w, event, prms, nprms) AnalyzeModeEvent(); } -void AnalyzeFileProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +AnalyzeFileProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { if (!first.analysisSupport) { char buf[MSG_SIZ]; @@ -5774,77 +5961,54 @@ void AnalyzeFileProc(w, event, prms, nprms) DisplayError(buf, 0); return; } - Reset(FALSE, TRUE); +// Reset(FALSE, TRUE); #ifndef OPTIONSDIALOG if (!appData.showThinking) ShowThinkingProc(w,event,prms,nprms); #endif AnalyzeFileEvent(); - FileNamePopUp(_("File to analyze"), "", ".pgn .game", LoadGamePopUp, "rb"); +// FileNamePopUp(_("File to analyze"), "", ".pgn .game", LoadGamePopUp, "rb"); AnalysisPeriodicEvent(1); } -void TwoMachinesProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +TwoMachinesProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { TwoMachinesEvent(); } -void MatchProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +MatchProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { - if(gameMode != BeginningOfGame) { DisplayError(_("You can only start a match from the initial position."), 0); return; } - appData.matchGames = appData.defaultMatchGames; - MatchEvent(2); + MatchEvent(2); } -void IcsClientProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +IcsClientProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { IcsClientEvent(); } -void EditGameProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +EditGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { EditGameEvent(); } -void EditPositionProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +EditPositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { EditPositionEvent(); } -void TrainingProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +TrainingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { TrainingEvent(); } -void EditCommentProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +EditCommentProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[5]; int j; @@ -5857,129 +6021,87 @@ void EditCommentProc(w, event, prms, nprms) EditCommentEvent(); } -void IcsInputBoxProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +IcsInputBoxProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { if (!PopDown(4)) ICSInputBoxPopUp(); } -void AcceptProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +AcceptProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { AcceptEvent(); } -void DeclineProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +DeclineProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { DeclineEvent(); } -void RematchProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +RematchProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { RematchEvent(); } -void CallFlagProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +CallFlagProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { CallFlagEvent(); } -void DrawProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +DrawProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { DrawEvent(); } -void AbortProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +AbortProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { AbortEvent(); } -void AdjournProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +AdjournProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { AdjournEvent(); } -void ResignProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +ResignProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { ResignEvent(); } -void AdjuWhiteProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +AdjuWhiteProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { UserAdjudicationEvent(+1); } -void AdjuBlackProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +AdjuBlackProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { UserAdjudicationEvent(-1); } -void AdjuDrawProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +AdjuDrawProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { UserAdjudicationEvent(0); } -void EnterKeyProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +EnterKeyProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { if (shellUp[4] == True) ICSInputSendText(); } -void UpKeyProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +UpKeyProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { // [HGM] input: let up-arrow recall previous line from history Widget edit; int j; @@ -6002,11 +6124,8 @@ void UpKeyProc(w, event, prms, nprms) } } -void DownKeyProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +DownKeyProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { // [HGM] input: let down-arrow recall next line from history Widget edit; String val; @@ -6024,130 +6143,114 @@ void DownKeyProc(w, event, prms, nprms) } } -void StopObservingProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +StopObservingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { StopObservingEvent(); } -void StopExaminingProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +StopExaminingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { StopExaminingEvent(); } -void UploadProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +UploadProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { UploadGameEvent(); } -void ForwardProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +ForwardProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { ForwardEvent(); } -void BackwardProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +BackwardProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { BackwardEvent(); } -void ToStartProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +TempBackwardProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) +{ + if (!TempBackwardActive) { + TempBackwardActive = True; + BackwardEvent(); + } +} + +void +TempForwardProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) +{ + /* Check to see if triggered by a key release event for a repeating key. + * If so the next queued event will be a key press of the same key at the same time */ + if (XEventsQueued(xDisplay, QueuedAfterReading)) { + XEvent next; + XPeekEvent(xDisplay, &next); + if (next.type == KeyPress && next.xkey.time == event->xkey.time && + next.xkey.keycode == event->xkey.keycode) + return; + } + ForwardEvent(); + TempBackwardActive = False; +} + +void +ToStartProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { ToStartEvent(); } -void ToEndProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +ToEndProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { ToEndEvent(); } -void RevertProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +RevertProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { RevertEvent(False); } -void AnnotateProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +AnnotateProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { RevertEvent(True); } -void TruncateGameProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +TruncateGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { TruncateGameEvent(); } -void RetractMoveProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; + +void +RetractMoveProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { RetractMoveEvent(); } -void MoveNowProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +MoveNowProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { MoveNowEvent(); } -void FlipViewProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +FlipViewProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { flipView = !flipView; DrawPosition(True, NULL); } -void PonderNextMoveProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +PonderNextMoveProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6164,11 +6267,8 @@ void PonderNextMoveProc(w, event, prms, nprms) } #ifndef OPTIONSDIALOG -void AlwaysQueenProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +AlwaysQueenProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6183,11 +6283,8 @@ void AlwaysQueenProc(w, event, prms, nprms) args, 1); } -void AnimateDraggingProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +AnimateDraggingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6203,11 +6300,8 @@ void AnimateDraggingProc(w, event, prms, nprms) args, 1); } -void AnimateMovingProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +AnimateMovingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6223,11 +6317,8 @@ void AnimateMovingProc(w, event, prms, nprms) args, 1); } -void AutoflagProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +AutoflagProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6242,11 +6333,8 @@ void AutoflagProc(w, event, prms, nprms) args, 1); } -void AutoflipProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +AutoflipProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6261,11 +6349,8 @@ void AutoflipProc(w, event, prms, nprms) args, 1); } -void BlindfoldProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +BlindfoldProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6282,11 +6367,8 @@ void BlindfoldProc(w, event, prms, nprms) DrawPosition(True, NULL); } -void TestLegalityProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +TestLegalityProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6302,11 +6384,8 @@ void TestLegalityProc(w, event, prms, nprms) } -void FlashMovesProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +FlashMovesProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6326,11 +6405,8 @@ void FlashMovesProc(w, event, prms, nprms) } #if HIGHDRAG -void HighlightDraggingProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +HighlightDraggingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6346,11 +6422,8 @@ void HighlightDraggingProc(w, event, prms, nprms) } #endif -void HighlightLastMoveProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +HighlightLastMoveProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6365,11 +6438,8 @@ void HighlightLastMoveProc(w, event, prms, nprms) "menuOptions.Highlight Last Move"), args, 1); } -void HighlightArrowProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +HighlightArrowProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6385,11 +6455,8 @@ void HighlightArrowProc(w, event, prms, nprms) } #if 0 -void IcsAlarmProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +IcsAlarmProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6405,11 +6472,8 @@ void IcsAlarmProc(w, event, prms, nprms) } #endif -void MoveSoundProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +MoveSoundProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6424,11 +6488,8 @@ void MoveSoundProc(w, event, prms, nprms) args, 1); } -void OneClickProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +OneClickProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6443,11 +6504,8 @@ void OneClickProc(w, event, prms, nprms) args, 1); } -void PeriodicUpdatesProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +PeriodicUpdatesProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6462,11 +6520,8 @@ void PeriodicUpdatesProc(w, event, prms, nprms) args, 1); } -void PopupExitMessageProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +PopupExitMessageProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6481,11 +6536,8 @@ void PopupExitMessageProc(w, event, prms, nprms) "menuOptions.Popup Exit Message"), args, 1); } -void PopupMoveErrorsProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +PopupMoveErrorsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6501,11 +6553,8 @@ void PopupMoveErrorsProc(w, event, prms, nprms) } #if 0 -void PremoveProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +PremoveProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6521,11 +6570,8 @@ void PremoveProc(w, event, prms, nprms) } #endif -void ShowCoordsProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +ShowCoordsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6542,21 +6588,15 @@ void ShowCoordsProc(w, event, prms, nprms) DrawPosition(True, NULL); } -void ShowThinkingProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +ShowThinkingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { appData.showThinking = !appData.showThinking; // [HGM] thinking: tken out of ShowThinkingEvent ShowThinkingEvent(); } -void HideThinkingProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +HideThinkingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6573,11 +6613,8 @@ void HideThinkingProc(w, event, prms, nprms) } #endif -void SaveOnExitProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +SaveOnExitProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { Arg args[16]; @@ -6592,20 +6629,14 @@ void SaveOnExitProc(w, event, prms, nprms) args, 1); } -void SaveSettingsProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +SaveSettingsProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { SaveSettings(settingsFileName); } -void InfoProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +InfoProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { char buf[MSG_SIZ]; snprintf(buf, sizeof(buf), "xterm -e info --directory %s --directory . -f %s &", @@ -6613,11 +6644,8 @@ void InfoProc(w, event, prms, nprms) system(buf); } -void ManProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +ManProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { char buf[MSG_SIZ]; String name; @@ -6629,88 +6657,94 @@ void ManProc(w, event, prms, nprms) system(buf); } -void HintProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +HintProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { HintEvent(); } -void BookProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +BookProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { BookEvent(); } -void AboutProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +BugReportProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) +{ + char buf[MSG_SIZ]; + snprintf(buf, MSG_SIZ, "%s mailto:bug-xboard@gnu.org", appData.sysOpen); + system(buf); +} + +void +GuideProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) +{ + char buf[MSG_SIZ]; + snprintf(buf, MSG_SIZ, "%s http://www.gnu.org/software/xboard/user_guide/UserGuide.html", appData.sysOpen); + system(buf); +} + +void +HomePageProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) +{ + char buf[MSG_SIZ]; + snprintf(buf, MSG_SIZ, "%s http://www.gnu.org/software/xboard/", appData.sysOpen); + system(buf); +} + +void +NewsPageProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { char buf[MSG_SIZ]; + snprintf(buf, MSG_SIZ, "%s http://www.gnu.org/software/xboard/whats_new/portal.html", appData.sysOpen); + system(buf); +} + +void +AboutProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) +{ + char buf[2 * MSG_SIZ]; #if ZIPPY - char *zippy = " (with Zippy code)"; + char *zippy = _(" (with Zippy code)"); #else char *zippy = ""; #endif - snprintf(buf, sizeof(buf), "%s%s\n\n%s\n%s\n%s\n\n%s%s\n%s", - programVersion, zippy, - "Copyright 1991 Digital Equipment Corporation", - "Enhancements Copyright 1992-2009 Free Software Foundation", - "Enhancements Copyright 2005 Alessandro Scotti", - PACKAGE, " is free software and carries NO WARRANTY;", - "see the file COPYING for more information."); + snprintf(buf, sizeof(buf), +_("%s%s\n\n" +"Copyright 1991 Digital Equipment Corporation\n" +"Enhancements Copyright 1992-2012 Free Software Foundation\n" +"Enhancements Copyright 2005 Alessandro Scotti\n\n" +"%s is free software and carries NO WARRANTY;" +"see the file COPYING for more information.\n\n" +"Visit XBoard on the web at: http://www.gnu.org/software/xboard/\n" +"Check out the newest features at: http://www.gnu.org/software/xboard/whats_new.html\n\n" +"Report bugs via email at: \n\n" + ), + programVersion, zippy, PACKAGE); ErrorPopUp(_("About XBoard"), buf, FALSE); } -void DebugProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +DebugProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { appData.debugMode = !appData.debugMode; } -void AboutGameProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +AboutGameProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { AboutGameEvent(); } -void NothingProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +NothingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { return; } -void Iconify(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; -{ - Arg args[16]; - - fromX = fromY = -1; - XtSetArg(args[0], XtNiconic, True); - XtSetValues(shellWidget, args, 1); -} - -void DisplayMessage(message, extMessage) - char *message, *extMessage; +void +DisplayMessage (char *message, char *extMessage) { /* display a message in the message widget */ @@ -6730,6 +6764,8 @@ void DisplayMessage(message, extMessage) }; }; + safeStrCpy(lastMsg, message, MSG_SIZ); // [HGM] make available + /* need to test if messageWidget already exists, since this function can also be called during the startup, if for example a Xresource is not set up correctly */ @@ -6742,8 +6778,8 @@ void DisplayMessage(message, extMessage) return; } -void DisplayTitle(text) - char *text; +void +DisplayTitle (char *text) { Arg args[16]; int i; @@ -6789,13 +6825,12 @@ void DisplayTitle(text) XtSetArg(args[i], XtNiconName, (XtArgVal) icon); i++; XtSetArg(args[i], XtNtitle, (XtArgVal) title); i++; XtSetValues(shellWidget, args, i); + XSync(xDisplay, False); } void -DisplayError(message, error) - String message; - int error; +DisplayError (String message, int error) { char buf[MSG_SIZ]; @@ -6815,8 +6850,8 @@ DisplayError(message, error) } -void DisplayMoveError(message) - String message; +void +DisplayMoveError (String message) { fromX = fromY = -1; ClearHighlights(); @@ -6832,9 +6867,8 @@ void DisplayMoveError(message) } -void DisplayFatalError(message, error, status) - String message; - int error, status; +void +DisplayFatalError (String message, int error, int status) { char buf[MSG_SIZ]; @@ -6854,30 +6888,28 @@ void DisplayFatalError(message, error, status) } } -void DisplayInformation(message) - String message; +void +DisplayInformation (String message) { ErrorPopDown(); ErrorPopUp(_("Information"), message, TRUE); } -void DisplayNote(message) - String message; +void +DisplayNote (String message) { ErrorPopDown(); ErrorPopUp(_("Note"), message, FALSE); } static int -NullXErrorCheck(dpy, error_event) - Display *dpy; - XErrorEvent *error_event; +NullXErrorCheck (Display *dpy, XErrorEvent *error_event) { return 0; } -void DisplayIcsInteractionTitle(message) - String message; +void +DisplayIcsInteractionTitle (String message) { if (oldICSInteractionTitle == NULL) { /* Magic to find the old window title, adapted from vim */ @@ -6908,11 +6940,8 @@ void DisplayIcsInteractionTitle(message) char pendingReplyPrefix[MSG_SIZ]; ProcRef pendingReplyPR; -void AskQuestionProc(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +AskQuestionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { if (*nprms != 4) { fprintf(stderr, _("AskQuestionProc needed 4 parameters, got %d\n"), @@ -6922,7 +6951,8 @@ void AskQuestionProc(w, event, prms, nprms) AskQuestionEvent(prms[0], prms[1], prms[2], prms[3]); } -void AskQuestionPopDown() +void +AskQuestionPopDown () { if (!askQuestionUp) return; XtPopdown(askQuestionShell); @@ -6930,11 +6960,8 @@ void AskQuestionPopDown() askQuestionUp = False; } -void AskQuestionReplyAction(w, event, prms, nprms) - Widget w; - XEvent *event; - String *prms; - Cardinal *nprms; +void +AskQuestionReplyAction (Widget w, XEvent *event, String *prms, Cardinal *nprms) { char buf[MSG_SIZ]; int err; @@ -6951,9 +6978,8 @@ void AskQuestionReplyAction(w, event, prms, nprms) if (err) DisplayFatalError(_("Error writing to chess program"), err, 0); } -void AskQuestionCallback(w, client_data, call_data) - Widget w; - XtPointer client_data, call_data; +void +AskQuestionCallback (Widget w, XtPointer client_data, XtPointer call_data) { String name; Arg args[16]; @@ -6968,9 +6994,8 @@ void AskQuestionCallback(w, client_data, call_data) } } -void AskQuestion(title, question, replyPrefix, pr) - char *title, *question, *replyPrefix; - ProcRef pr; +void +AskQuestion (char *title, char *question, char *replyPrefix, ProcRef pr) { Arg args[16]; Widget popup, layout, dialog, edit; @@ -7024,8 +7049,7 @@ void AskQuestion(title, question, replyPrefix, pr) void -PlaySound(name) - char *name; +PlaySound (char *name) { if (*name == NULLCHAR) { return; @@ -7034,6 +7058,7 @@ PlaySound(name) } else { char buf[2048]; char *prefix = "", *sep = ""; + if(appData.soundProgram[0] == NULLCHAR) return; if(!strchr(name, '/')) { prefix = appData.soundDirectory; sep = "/"; } snprintf(buf, sizeof(buf), "%s '%s%s%s' &", appData.soundProgram, prefix, sep, name); system(buf); @@ -7041,57 +7066,69 @@ PlaySound(name) } void -RingBell() +RingBell () { PlaySound(appData.soundMove); } void -PlayIcsWinSound() +PlayIcsWinSound () { PlaySound(appData.soundIcsWin); } void -PlayIcsLossSound() +PlayIcsLossSound () { PlaySound(appData.soundIcsLoss); } void -PlayIcsDrawSound() +PlayIcsDrawSound () { PlaySound(appData.soundIcsDraw); } void -PlayIcsUnfinishedSound() +PlayIcsUnfinishedSound () { PlaySound(appData.soundIcsUnfinished); } void -PlayAlarmSound() +PlayAlarmSound () { PlaySound(appData.soundIcsAlarm); } void -EchoOn() +PlayTellSound () +{ + PlaySound(appData.soundTell); +} + +void +EchoOn () { system("stty echo"); + noEcho = False; } void -EchoOff() +EchoOff () { system("stty -echo"); + noEcho = True; } void -Colorize(cc, continuation) - ColorClass cc; - int continuation; +RunCommand (char *buf) +{ + system(buf); +} + +void +Colorize (ColorClass cc, int continuation) { char buf[MSG_SIZ]; int count, outCount, error; @@ -7154,14 +7191,14 @@ Colorize(cc, continuation) } } -char *UserName() +char * +UserName () { return getpwuid(getuid())->pw_name; } static char * -ExpandPathName(path) - char *path; +ExpandPathName (char *path) { static char static_buf[4*MSG_SIZ]; char *d, *s, buf[4*MSG_SIZ]; @@ -7203,7 +7240,8 @@ ExpandPathName(path) return static_buf; } -char *HostName() +char * +HostName () { static char host_name[MSG_SIZ]; @@ -7224,15 +7262,14 @@ XtIntervalId delayedEventTimerXID = 0; DelayedEventCallback delayedEventCallback = 0; void -FireDelayedEvent() +FireDelayedEvent () { delayedEventTimerXID = 0; delayedEventCallback(); } void -ScheduleDelayedEvent(cb, millisec) - DelayedEventCallback cb; long millisec; +ScheduleDelayedEvent (DelayedEventCallback cb, long millisec) { if(delayedEventTimerXID && delayedEventCallback == cb) // [HGM] alive: replace, rather than add or flush identical event @@ -7244,7 +7281,7 @@ ScheduleDelayedEvent(cb, millisec) } DelayedEventCallback -GetDelayedEvent() +GetDelayedEvent () { if (delayedEventTimerXID) { return delayedEventCallback; @@ -7254,7 +7291,7 @@ GetDelayedEvent() } void -CancelDelayedEvent() +CancelDelayedEvent () { if (delayedEventTimerXID) { XtRemoveTimeOut(delayedEventTimerXID); @@ -7264,12 +7301,14 @@ CancelDelayedEvent() XtIntervalId loadGameTimerXID = 0; -int LoadGameTimerRunning() +int +LoadGameTimerRunning () { return loadGameTimerXID != 0; } -int StopLoadGameTimer() +int +StopLoadGameTimer () { if (loadGameTimerXID != 0) { XtRemoveTimeOut(loadGameTimerXID); @@ -7281,17 +7320,14 @@ int StopLoadGameTimer() } void -LoadGameTimerCallback(arg, id) - XtPointer arg; - XtIntervalId *id; +LoadGameTimerCallback (XtPointer arg, XtIntervalId *id) { loadGameTimerXID = 0; AutoPlayGameLoop(); } void -StartLoadGameTimer(millisec) - long millisec; +StartLoadGameTimer (long millisec) { loadGameTimerXID = XtAppAddTimeOut(appContext, millisec, @@ -7302,9 +7338,7 @@ StartLoadGameTimer(millisec) XtIntervalId analysisClockXID = 0; void -AnalysisClockCallback(arg, id) - XtPointer arg; - XtIntervalId *id; +AnalysisClockCallback (XtPointer arg, XtIntervalId *id) { if (gameMode == AnalyzeMode || gameMode == AnalyzeFile || appData.icsEngineAnalyze) { // [DM] @@ -7314,7 +7348,7 @@ AnalysisClockCallback(arg, id) } void -StartAnalysisClock() +StartAnalysisClock () { analysisClockXID = XtAppAddTimeOut(appContext, 2000, @@ -7324,12 +7358,14 @@ StartAnalysisClock() XtIntervalId clockTimerXID = 0; -int ClockTimerRunning() +int +ClockTimerRunning () { return clockTimerXID != 0; } -int StopClockTimer() +int +StopClockTimer () { if (clockTimerXID != 0) { XtRemoveTimeOut(clockTimerXID); @@ -7341,17 +7377,14 @@ int StopClockTimer() } void -ClockTimerCallback(arg, id) - XtPointer arg; - XtIntervalId *id; +ClockTimerCallback (XtPointer arg, XtIntervalId *id) { clockTimerXID = 0; DecrementClocks(); } void -StartClockTimer(millisec) - long millisec; +StartClockTimer (long millisec) { clockTimerXID = XtAppAddTimeOut(appContext, millisec, @@ -7360,11 +7393,7 @@ StartClockTimer(millisec) } void -DisplayTimerLabel(w, color, timer, highlight) - Widget w; - char *color; - long timer; - int highlight; +DisplayTimerLabel (Widget w, char *color, long timer, int highlight) { char buf[MSG_SIZ]; Arg args[16]; @@ -7398,9 +7427,7 @@ DisplayTimerLabel(w, color, timer, highlight) } void -DisplayWhiteClock(timeRemaining, highlight) - long timeRemaining; - int highlight; +DisplayWhiteClock (long timeRemaining, int highlight) { Arg args[16]; @@ -7414,9 +7441,7 @@ DisplayWhiteClock(timeRemaining, highlight) } void -DisplayBlackClock(timeRemaining, highlight) - long timeRemaining; - int highlight; +DisplayBlackClock (long timeRemaining, int highlight) { Arg args[16]; @@ -7443,10 +7468,8 @@ typedef struct { } ChildProc; -int StartChildProcess(cmdLine, dir, pr) - char *cmdLine; - char *dir; - ProcRef *pr; +int +StartChildProcess (char *cmdLine, char *dir, ProcRef *pr) { char *argv[64], *p; int i, pid; @@ -7455,7 +7478,7 @@ int StartChildProcess(cmdLine, dir, pr) char buf[MSG_SIZ]; if (appData.debugMode) { - fprintf(stderr, "StartChildProcess (dir=\"%s\") %s\n",dir, cmdLine); + fprintf(debugFP, "StartChildProcess (dir=\"%s\") %s\n",dir, cmdLine); } /* We do NOT feed the cmdLine to the shell; we just @@ -7518,15 +7541,14 @@ int StartChildProcess(cmdLine, dir, pr) } // [HGM] kill: implement the 'hard killing' of AS's Winboard_x -static RETSIGTYPE AlarmCallBack(int n) +static RETSIGTYPE +AlarmCallBack (int n) { return; } void -DestroyChildProcess(pr, signalType) - ProcRef pr; - int signalType; +DestroyChildProcess (ProcRef pr, int signalType) { ChildProc *cp = (ChildProc *) pr; @@ -7553,8 +7575,7 @@ DestroyChildProcess(pr, signalType) } void -InterruptChildProcess(pr) - ProcRef pr; +InterruptChildProcess (ProcRef pr) { ChildProc *cp = (ChildProc *) pr; @@ -7562,10 +7583,8 @@ InterruptChildProcess(pr) (void) kill(cp->pid, SIGINT); /* stop it thinking */ } -int OpenTelnet(host, port, pr) - char *host; - char *port; - ProcRef *pr; +int +OpenTelnet (char *host, char *port, ProcRef *pr) { char cmdLine[MSG_SIZ]; @@ -7577,58 +7596,46 @@ int OpenTelnet(host, port, pr) return StartChildProcess(cmdLine, "", pr); } -int OpenTCP(host, port, pr) - char *host; - char *port; - ProcRef *pr; +int +OpenTCP (char *host, char *port, ProcRef *pr) { #if OMIT_SOCKETS DisplayFatalError(_("Socket support is not configured in"), 0, 2); #else /* !OMIT_SOCKETS */ - int s; - struct sockaddr_in sa; - struct hostent *hp; - unsigned short uport; + struct addrinfo hints; + struct addrinfo *ais, *ai; + int error; + int s=0; ChildProc *cp; - if ((s = socket(AF_INET, SOCK_STREAM, 6)) < 0) { - return errno; - } - - memset((char *) &sa, (int)0, sizeof(struct sockaddr_in)); - sa.sin_family = AF_INET; - sa.sin_addr.s_addr = INADDR_ANY; - uport = (unsigned short) 0; - sa.sin_port = htons(uport); - if (bind(s, (struct sockaddr *) &sa, sizeof(struct sockaddr_in)) < 0) { - return errno; - } - - memset((char *) &sa, (int)0, sizeof(struct sockaddr_in)); - if (!(hp = gethostbyname(host))) { - int b0, b1, b2, b3; - if (sscanf(host, "%d.%d.%d.%d", &b0, &b1, &b2, &b3) == 4) { - hp = (struct hostent *) calloc(1, sizeof(struct hostent)); - hp->h_addrtype = AF_INET; - hp->h_length = 4; - hp->h_addr_list = (char **) calloc(2, sizeof(char *)); - hp->h_addr_list[0] = (char *) malloc(4); - hp->h_addr_list[0][0] = b0; - hp->h_addr_list[0][1] = b1; - hp->h_addr_list[0][2] = b2; - hp->h_addr_list[0][3] = b3; - } else { - return ENOENT; - } + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + + error = getaddrinfo(host, port, &hints, &ais); + if (error != 0) { + /* a getaddrinfo error is not an errno, so can't return it */ + fprintf(debugFP, "getaddrinfo(%s, %s): %s\n", + host, port, gai_strerror(error)); + return ENOENT; + } + + for (ai = ais; ai != NULL; ai = ai->ai_next) { + if ((s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) { + error = errno; + continue; + } + if (connect(s, ai->ai_addr, ai->ai_addrlen) < 0) { + error = errno; + continue; + } + error = 0; + break; } - sa.sin_family = hp->h_addrtype; - uport = (unsigned short) atoi(port); - sa.sin_port = htons(uport); - memcpy((char *) &sa.sin_addr, hp->h_addr, hp->h_length); + freeaddrinfo(ais); - if (connect(s, (struct sockaddr *) &sa, - sizeof(struct sockaddr_in)) < 0) { - return errno; + if (error != 0) { + return error; } cp = (ChildProc *) calloc(1, sizeof(ChildProc)); @@ -7637,15 +7644,13 @@ int OpenTCP(host, port, pr) cp->fdFrom = s; cp->fdTo = s; *pr = (ProcRef) cp; - #endif /* !OMIT_SOCKETS */ return 0; } -int OpenCommPort(name, pr) - char *name; - ProcRef *pr; +int +OpenCommPort (char *name, ProcRef *pr) { int fd; ChildProc *cp; @@ -7663,8 +7668,8 @@ int OpenCommPort(name, pr) return 0; } -int OpenLoopback(pr) - ProcRef *pr; +int +OpenLoopback (ProcRef *pr) { ChildProc *cp; int to[2], from[2]; @@ -7681,9 +7686,8 @@ int OpenLoopback(pr) return 0; } -int OpenRcmd(host, user, cmd, pr) - char *host, *user, *cmd; - ProcRef *pr; +int +OpenRcmd (char *host, char *user, char *cmd, ProcRef *pr) { DisplayFatalError(_("internal rcmd not implemented for Unix"), 0, 1); return -1; @@ -7703,10 +7707,7 @@ typedef struct { } InputSource; void -DoInputCallback(closure, source, xid) - caddr_t closure; - int *source; - XtInputId *xid; +DoInputCallback (caddr_t closure, int *source, XtInputId *xid) { InputSource *is = (InputSource *) closure; int count; @@ -7744,11 +7745,8 @@ DoInputCallback(closure, source, xid) } } -InputSourceRef AddInputSource(pr, lineByLine, func, closure) - ProcRef pr; - int lineByLine; - InputCallback func; - VOIDSTAR closure; +InputSourceRef +AddInputSource (ProcRef pr, int lineByLine, InputCallback func, VOIDSTAR closure) { InputSource *is; ChildProc *cp = (ChildProc *) pr; @@ -7776,8 +7774,7 @@ InputSourceRef AddInputSource(pr, lineByLine, func, closure) } void -RemoveInputSource(isr) - InputSourceRef isr; +RemoveInputSource (InputSourceRef isr) { InputSource *is = (InputSource *) isr; @@ -7786,11 +7783,8 @@ RemoveInputSource(isr) is->xid = 0; } -int OutputToProcess(pr, message, count, outError) - ProcRef pr; - char *message; - int count; - int *outError; +int +OutputToProcess (ProcRef pr, char *message, int count, int *outError) { static int line = 0; ChildProc *cp = (ChildProc *) pr; @@ -7834,12 +7828,8 @@ int OutputToProcess(pr, message, count, outError) between each character. This is needed when sending the logon script to ICC, which for some reason doesn't like the instantaneous send. */ -int OutputToProcessDelayed(pr, message, count, outError, msdelay) - ProcRef pr; - char *message; - int count; - int *outError; - long msdelay; +int +OutputToProcessDelayed (ProcRef pr, char *message, int count, int *outError, long msdelay) { ChildProc *cp = (ChildProc *) pr; int outCount = 0; @@ -7881,8 +7871,7 @@ int OutputToProcessDelayed(pr, message, count, outError, msdelay) static int xpmDone = 0; static void -CreateAnimMasks (pieceDepth) - int pieceDepth; +CreateAnimMasks (int pieceDepth) { ChessSquare piece; Pixmap buf; @@ -7960,9 +7949,7 @@ CreateAnimMasks (pieceDepth) } static void -InitAnimState (anim, info) - AnimState * anim; - XWindowAttributes * info; +InitAnimState (AnimState *anim, XWindowAttributes *info) { XtGCMask mask; XGCValues values; @@ -8005,16 +7992,15 @@ CreateAnimVars () /* For XPM pieces, we need bitmaps to use as masks. */ if (useImages) - CreateAnimMasks(info.depth); - xpmDone = 1; + CreateAnimMasks(info.depth), xpmDone = 1; } #ifndef HAVE_USLEEP static Boolean frameWaiting; -static RETSIGTYPE FrameAlarm (sig) - int sig; +static RETSIGTYPE +FrameAlarm (int sig) { frameWaiting = False; /* In case System-V style signals. Needed?? */ @@ -8022,8 +8008,7 @@ static RETSIGTYPE FrameAlarm (sig) } static void -FrameDelay (time) - int time; +FrameDelay (int time) { struct itimerval delay; @@ -8047,8 +8032,7 @@ FrameDelay (time) #else static void -FrameDelay (time) - int time; +FrameDelay (int time) { XSync(xDisplay, False); if (time > 0) @@ -8057,11 +8041,16 @@ FrameDelay (time) #endif +void +DoSleep (int n) +{ + FrameDelay(n); +} + /* Convert board position to corner of screen rect and color */ static void -ScreenSquare(column, row, pt, color) - int column; int row; XPoint * pt; int * color; +ScreenSquare (int column, int row, XPoint *pt, int *color) { if (flipView) { pt->x = lineGap + ((BOARD_WIDTH-1)-column) * (squareSize + lineGap); @@ -8076,8 +8065,7 @@ ScreenSquare(column, row, pt, color) /* Convert window coords to square */ static void -BoardSquare(x, y, column, row) - int x; int y; int * column; int * row; +BoardSquare (int x, int y, int *column, int *row) { *column = EventToSquare(x, BOARD_WIDTH); if (flipView && *column >= 0) @@ -8095,8 +8083,7 @@ BoardSquare(x, y, column, row) #define Min(a, b) ((a) < (b) ? (a) : (b)) static void -SetRect(rect, x, y, width, height) - XRectangle * rect; int x; int y; int width; int height; +SetRect (XRectangle *rect, int x, int y, int width, int height) { rect->x = x; rect->y = y; @@ -8109,9 +8096,7 @@ SetRect(rect, x, y, width, height) that rect within new. */ static Boolean -Intersect(old, new, size, area, pt) - XPoint * old; XPoint * new; - int size; XRectangle * area; XPoint * pt; +Intersect ( XPoint *old, XPoint *new, int size, XRectangle *area, XPoint *pt) { if (old->x > new->x + size || new->x > old->x + size || old->y > new->y + size || new->y > old->y + size) { @@ -8129,9 +8114,7 @@ Intersect(old, new, size, area, pt) in the old that do not intersect with the new. */ static void -CalcUpdateRects(old, new, size, update, nUpdates) - XPoint * old; XPoint * new; int size; - XRectangle update[]; int * nUpdates; +CalcUpdateRects (XPoint *old, XPoint *new, int size, XRectangle update[], int *nUpdates) { int count; @@ -8177,10 +8160,7 @@ CalcUpdateRects(old, new, size, update, nUpdates) noticeable. */ static void -Tween(start, mid, finish, factor, frames, nFrames) - XPoint * start; XPoint * mid; - XPoint * finish; int factor; - XPoint frames[]; int * nFrames; +Tween (XPoint *start, XPoint *mid, XPoint *finish, int factor, XPoint frames[], int *nFrames) { int fraction, n, count; @@ -8215,8 +8195,7 @@ Tween(start, mid, finish, factor, frames, nFrames) /* Draw a piece on the screen without disturbing what's there */ static void -SelectGCMask(piece, clip, outline, mask) - ChessSquare piece; GC * clip; GC * outline; Pixmap * mask; +SelectGCMask (ChessSquare piece, GC *clip, GC *outline, Pixmap *mask) { GC source; @@ -8256,8 +8235,7 @@ SelectGCMask(piece, clip, outline, mask) } static void -OverlayPiece(piece, clip, outline, dest) - ChessSquare piece; GC clip; GC outline; Drawable dest; +OverlayPiece (ChessSquare piece, GC clip, GC outline, Drawable dest) { int kind; @@ -8287,11 +8265,7 @@ OverlayPiece(piece, clip, outline, dest) /* Animate the movement of a single piece */ static void -BeginAnimation(anim, piece, startColor, start) - AnimState *anim; - ChessSquare piece; - int startColor; - XPoint * start; +BeginAnimation (AnimState *anim, ChessSquare piece, int startColor, XPoint *start) { Pixmap mask; @@ -8306,10 +8280,7 @@ BeginAnimation(anim, piece, startColor, start) } static void -AnimationFrame(anim, frame, piece) - AnimState *anim; - XPoint *frame; - ChessSquare piece; +AnimationFrame (AnimState *anim, XPoint *frame, ChessSquare piece) { XRectangle updates[4]; XRectangle overlap; @@ -8359,9 +8330,7 @@ AnimationFrame(anim, frame, piece) } static void -EndAnimation (anim, finish) - AnimState *anim; - XPoint *finish; +EndAnimation (AnimState *anim, XPoint *finish) { XRectangle updates[4]; XRectangle overlap; @@ -8386,11 +8355,7 @@ EndAnimation (anim, finish) } static void -FrameSequence(anim, piece, startColor, start, finish, frames, nFrames) - AnimState *anim; - ChessSquare piece; int startColor; - XPoint * start; XPoint * finish; - XPoint frames[]; int nFrames; +FrameSequence (AnimState *anim, ChessSquare piece, int startColor, XPoint *start, XPoint *finish, XPoint frames[], int nFrames) { int n; @@ -8403,7 +8368,7 @@ FrameSequence(anim, piece, startColor, start, finish, frames, nFrames) } void -AnimateAtomicCapture(Board board, int fromX, int fromY, int toX, int toY) +AnimateAtomicCapture (Board board, int fromX, int fromY, int toX, int toY) { int i, x, y; ChessSquare piece = board[fromY][toY]; @@ -8428,12 +8393,7 @@ AnimateAtomicCapture(Board board, int fromX, int fromY, int toX, int toY) /* Main control logic for deciding what to animate and how */ void -AnimateMove(board, fromX, fromY, toX, toY) - Board board; - int fromX; - int fromY; - int toX; - int toY; +AnimateMove (Board board, int fromX, int fromY, int toX, int toY) { ChessSquare piece; int hop; @@ -8459,11 +8419,6 @@ AnimateMove(board, fromX, fromY, toX, toY) hop = abs(fromX-toX) == 1 && abs(fromY-toY) == 2 || abs(fromX-toX) == 2 && abs(fromY-toY) == 1; #endif - if (appData.debugMode) { - fprintf(debugFP, hop ? _("AnimateMove: piece %d hops from %d,%d to %d,%d \n") : - _("AnimateMove: piece %d slides from %d,%d to %d,%d \n"), - piece, fromX, fromY, toX, toY); } - ScreenSquare(fromX, fromY, &start, &startColor); ScreenSquare(toX, toY, &finish, &endColor); @@ -8498,8 +8453,7 @@ AnimateMove(board, fromX, fromY, toX, toY) } void -DragPieceBegin(x, y) - int x; int y; +DragPieceBegin (int x, int y, Boolean instantly) { int boardX, boardY, color; XPoint corner; @@ -8552,7 +8506,7 @@ DragPieceBegin(x, y) } void -ChangeDragPiece(ChessSquare piece) +ChangeDragPiece (ChessSquare piece) { Pixmap mask; player.dragPiece = piece; @@ -8562,8 +8516,7 @@ ChangeDragPiece(ChessSquare piece) } static void -DragPieceMove(x, y) - int x; int y; +DragPieceMove (int x, int y) { XPoint corner; @@ -8589,8 +8542,7 @@ DragPieceMove(x, y) } void -DragPieceEnd(x, y) - int x; int y; +DragPieceEnd (int x, int y) { int boardX, boardY, color; XPoint corner; @@ -8636,7 +8588,8 @@ DrawDragPiece () } #include -int get_term_width() +int +get_term_width () { int fd, default_width; @@ -8656,7 +8609,7 @@ int get_term_width() } void -update_ics_width() +update_ics_width () { static int old_width = 0; int new_width = get_term_width(); @@ -8666,7 +8619,8 @@ update_ics_width() old_width = new_width; } -void NotifyFrontendLogin() +void +NotifyFrontendLogin () { update_ics_width(); } @@ -8678,17 +8632,20 @@ static double A_WIDTH = 5; /* Width of arrow body */ #define A_HEIGHT_FACTOR 6 /* Length of arrow "point", relative to body width */ #define A_WIDTH_FACTOR 3 /* Width of arrow "point", relative to body width */ -static double Sqr( double x ) +static double +Sqr (double x) { return x*x; } -static int Round( double x ) +static int +Round (double x) { return (int) (x + 0.5); } -void SquareToPos(int rank, int file, int *x, int *y) +void +SquareToPos (int rank, int file, int *x, int *y) { if (flipView) { *x = lineGap + ((BOARD_WIDTH-1)-file) * (squareSize + lineGap); @@ -8700,9 +8657,10 @@ void SquareToPos(int rank, int file, int *x, int *y) } /* Draw an arrow between two points using current settings */ -void DrawArrowBetweenPoints( int s_x, int s_y, int d_x, int d_y ) +void +DrawArrowBetweenPoints (int s_x, int s_y, int d_x, int d_y) { - XPoint arrow[7]; + XPoint arrow[8]; double dx, dy, j, k, x, y; if( d_x == s_x ) { @@ -8799,13 +8757,29 @@ void DrawArrowBetweenPoints( int s_x, int s_y, int d_x, int d_y ) } XFillPolygon(xDisplay, xBoardWindow, highlineGC, arrow, 7, Nonconvex, CoordModeOrigin); + if(appData.monoMode) arrow[7] = arrow[0], XDrawLines(xDisplay, xBoardWindow, darkSquareGC, arrow, 8, CoordModeOrigin); // Polygon( hdc, arrow, 7 ); } +void +ArrowDamage (int s_col, int s_row, int d_col, int d_row) +{ + int hor, vert, i; + hor = 64*s_col + 32; vert = 64*s_row + 32; + for(i=0; i<= 64; i++) { + damage[0][vert+6>>6][hor+6>>6] = True; + damage[0][vert-6>>6][hor+6>>6] = True; + damage[0][vert+6>>6][hor-6>>6] = True; + damage[0][vert-6>>6][hor-6>>6] = True; + hor += d_col - s_col; vert += d_row - s_row; + } +} + /* [AS] Draw an arrow between two squares */ -void DrawArrowBetweenSquares( int s_col, int s_row, int d_col, int d_row ) +void +DrawArrowBetweenSquares (int s_col, int s_row, int d_col, int d_row) { - int s_x, s_y, d_x, d_y, hor, vert, i; + int s_x, s_y, d_x, d_y; if( s_col == d_col && s_row == d_row ) { return; @@ -8842,24 +8816,25 @@ void DrawArrowBetweenSquares( int s_col, int s_row, int d_col, int d_row ) A_WIDTH = squareSize / 14.; //[HGM] make float DrawArrowBetweenPoints( s_x, s_y, d_x, d_y ); - - hor = 64*s_col + 32; vert = 64*s_row + 32; - for(i=0; i<= 64; i++) { - damage[0][vert+6>>6][hor+6>>6] = True; - damage[0][vert-6>>6][hor+6>>6] = True; - damage[0][vert+6>>6][hor-6>>6] = True; - damage[0][vert-6>>6][hor-6>>6] = True; - hor += d_col - s_col; vert += d_row - s_row; - } + ArrowDamage(s_col, s_row, d_col, d_row); } -Boolean IsDrawArrowEnabled() +Boolean +IsDrawArrowEnabled () { return appData.highlightMoveWithArrow && squareSize >= 32; } -void DrawArrowHighlight(int fromX, int fromY, int toX,int toY) +void +DrawArrowHighlight (int fromX, int fromY, int toX,int toY) { if( IsDrawArrowEnabled() && fromX >= 0 && fromY >= 0 && toX >= 0 && toY >= 0) DrawArrowBetweenSquares(fromX, fromY, toX, toY); } + +void +UpdateLogos (int displ) +{ + return; // no logos in XBoard yet +} +