X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xboard.c;h=6aea957ab543077bdb21839c7aed80e6ba349600;hb=c0d0ea91773838e5d11c3cd3b407fea251058c34;hp=4ee3c19905686574d9da47fc4f657218a941a62d;hpb=412e5bff85b4e47d337cfb4923cc406325903df2;p=xboard.git diff --git a/xboard.c b/xboard.c index 4ee3c19..6aea957 100644 --- a/xboard.c +++ b/xboard.c @@ -206,6 +206,7 @@ extern char *getenv(); #include "menus.h" #include "board.h" #include "dialogs.h" +#include "engineoutput.h" #include "usystem.h" #include "gettext.h" @@ -235,39 +236,21 @@ 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, 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)); -static void DropMenuSelect P((Widget w, ChessSquare piece, caddr_t junk)); void ReadBitmap P((Pixmap *pm, String name, unsigned char bits[], u_int wreq, u_int hreq)); void CreateGrid P((void)); void EventProc P((Widget widget, caddr_t unused, XEvent *event)); void DelayedDrag P((void)); static 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, - String * params, Cardinal * nParams)); void HandlePV P((Widget w, XEvent * event, String * params, Cardinal * nParams)); -void SelectPV P((Widget w, XEvent * event, - String * params, Cardinal * nParams)); -void StopPV P((Widget w, XEvent * event, - String * params, Cardinal * nParams)); -void WhiteClock P((Widget w, XEvent *event, - String *prms, Cardinal *nprms)); -void BlackClock P((Widget w, XEvent *event, - String *prms, Cardinal *nprms)); void DrawPositionProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms)); void CommentClick P((Widget w, XEvent * event, @@ -291,6 +274,7 @@ void SelectMove P((Widget w, XEvent * event, String * params, Cardinal * nParams void update_ics_width P(()); int get_term_width P(()); int CopyMemoProc P(()); +void SetupDropMenu P((void)); /* * XBoard depends on Xt R4 or higher @@ -307,13 +291,8 @@ GC lightSquareGC, darkSquareGC, lineGC, wdPieceGC, wlPieceGC, bdPieceGC, blPieceGC, wbPieceGC, bwPieceGC, coordGC, highlineGC, prelineGC, countGC; Pixmap iconPixmap, wIconPixmap, bIconPixmap, xMarkPixmap; -Widget shellWidget, layoutWidget, formWidget, boardWidget, messageWidget, - whiteTimerWidget, blackTimerWidget, titleWidget, widgetList[16], - commentShell, whitePieceMenu, blackPieceMenu, dropMenu, - menuBarWidget, buttonBarWidget, editShell, errorShell, analysisShell, - ICSInputShell, fileNameShell; -Widget historyShell, evalGraphShell, gameListShell; -XSegment secondSegments[BOARD_RANKS + BOARD_FILES + 2]; +Widget shellWidget, formWidget, boardWidget, titleWidget, dropMenu, menuBarWidget; +Option *optList; // contains all widgets of main window XSegment gridSegments[BOARD_RANKS + BOARD_FILES + 2]; #if ENABLE_NLS XFontSet fontSet, clockFontSet; @@ -339,9 +318,7 @@ Boolean chessProgram; int minX, minY; // [HGM] placement: volatile limits on upper-left corner int smallLayout = 0, tinyLayout = 0, marginW, marginH, // [HGM] for run-time resizing - fromX = -1, fromY = -1, toX, toY, commentUp = False, analysisUp = False, - ICSInputBoxUp = False, - filenameUp = False, pmFromX = -1, pmFromY = -1, + fromX = -1, fromY = -1, toX, toY, commentUp = False, errorExitStatus = -1, defaultLineGap; Dimension textHeight; Pixel timerForegroundPixel, timerBackgroundPixel; @@ -394,49 +371,6 @@ static Pixmap xpmMask[BlackKing + 1]; SizeDefaults sizeDefaults[] = SIZE_DEFAULTS; -#define PAUSE_BUTTON "P" -MenuItem buttonBar[] = { - {"<<", "<<", ToStartEvent}, - {"<", "<", BackwardEvent}, - {N_(PAUSE_BUTTON), PAUSE_BUTTON, PauseEvent}, - {">", ">", ForwardEvent}, - {">>", ">>", ToEndEvent}, - {NULL, NULL, NULL} -}; - -#define PIECE_MENU_SIZE 18 -String pieceMenuStrings[2][PIECE_MENU_SIZE] = { - { N_("White"), "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"), - N_("Queen"), N_("King"), "----", N_("Elephant"), N_("Cannon"), - N_("Archbishop"), N_("Chancellor"), "----", N_("Promote"), N_("Demote"), - N_("Empty square"), N_("Clear board") }, - { N_("Black"), "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"), - N_("Queen"), N_("King"), "----", N_("Elephant"), N_("Cannon"), - N_("Archbishop"), N_("Chancellor"), "----", N_("Promote"), N_("Demote"), - N_("Empty square"), N_("Clear board") } -}; -/* 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, - WhiteCannon, WhiteAngel, WhiteMarshall, (ChessSquare) 0, - PromotePiece, DemotePiece, EmptySquare, ClearBoard }, - { BlackPlay, (ChessSquare) 0, BlackPawn, BlackKnight, BlackBishop, - BlackRook, BlackQueen, BlackKing, (ChessSquare) 0, BlackAlfil, - BlackCannon, BlackAngel, BlackMarshall, (ChessSquare) 0, - PromotePiece, DemotePiece, EmptySquare, ClearBoard }, -}; - -#define DROP_MENU_SIZE 6 -String dropMenuStrings[DROP_MENU_SIZE] = { - "----", N_("Pawn"), N_("Knight"), N_("Bishop"), N_("Rook"), N_("Queen") - }; -/* must be in same order as dropMenuStrings! */ -ChessSquare dropMenuTranslation[DROP_MENU_SIZE] = { - (ChessSquare) 0, WhitePawn, WhiteKnight, WhiteBishop, - WhiteRook, WhiteQueen -}; - typedef struct { char piece; char* widget; @@ -459,41 +393,6 @@ Arg shellArgs[] = { { XtNmaxHeight, 0 } }; -Arg layoutArgs[] = { - { XtNborderWidth, 0 }, - { XtNdefaultDistance, 0 }, -}; - -Arg formArgs[] = { - { XtNborderWidth, 0 }, - { XtNresizable, (XtArgVal) True }, -}; - -Arg boardArgs[] = { - { XtNborderWidth, 0 }, - { XtNwidth, 0 }, - { XtNheight, 0 } -}; - -Arg titleArgs[] = { - { XtNjustify, (XtArgVal) XtJustifyRight }, - { XtNlabel, (XtArgVal) "..." }, - { XtNresizable, (XtArgVal) True }, - { XtNresize, (XtArgVal) False } -}; - -Arg messageArgs[] = { - { XtNjustify, (XtArgVal) XtJustifyLeft }, - { XtNlabel, (XtArgVal) "..." }, - { XtNresizable, (XtArgVal) True }, - { XtNresize, (XtArgVal) False } -}; - -Arg timerArgs[] = { - { XtNborderWidth, 0 }, - { XtNjustify, (XtArgVal) XtJustifyLeft } -}; - XtResource clientResources[] = { { "flashCount", "flashCount", XtRInt, sizeof(int), XtOffset(AppDataPtr, flashCount), XtRImmediate, @@ -508,23 +407,15 @@ XrmOptionDescRec shellOptions[] = { XtActionsRec boardActions[] = { { "DrawPosition", DrawPositionProc }, - { "HandleUserMove", HandleUserMove }, - { "AnimateUserMove", AnimateUserMove }, { "HandlePV", HandlePV }, { "SelectPV", SelectPV }, { "StopPV", StopPV }, - { "PieceMenuPopup", PieceMenuPopup }, - { "WhiteClock", WhiteClock }, - { "BlackClock", BlackClock }, { "MenuItem", KeyBindingProc }, // [HGM] generic handler for key bindings { "QuitProc", QuitWrapper }, { "ManProc", ManInner }, { "TempBackwardProc", TempBackwardProc }, { "TempForwardProc", TempForwardProc }, { "CommentClick", (XtActionProc) CommentClick }, - { "GameListPopDown", (XtActionProc) GameListPopDown }, - { "EngineOutputPopDown", (XtActionProc) EngineOutputPopDown }, - { "EvalGraphPopDown", (XtActionProc) EvalGraphPopDown }, { "GenericPopDown", (XtActionProc) GenericPopDown }, { "ErrorPopDown", (XtActionProc) ErrorPopDown }, { "CopyMemoProc", (XtActionProc) CopyMemoProc }, @@ -540,60 +431,60 @@ XtActionsRec boardActions[] = { }; char globalTranslations[] = - ":F9: MenuItem(ResignProc) \n \ - :Ctrln: MenuItem(NewGame) \n \ - :MetaV: MenuItem(NewVariant) \n \ - :Ctrlo: MenuItem(LoadGame) \n \ + ":F9: MenuItem(Actions.Resign) \n \ + :Ctrln: MenuItem(File.NewGame) \n \ + :MetaV: MenuItem(File.NewVariant) \n \ + :Ctrlo: MenuItem(File.LoadGame) \n \ :MetaNext: MenuItem(LoadNextGameProc) \n \ :MetaPrior: MenuItem(LoadPrevGameProc) \n \ :CtrlDown: LoadSelectedProc(3) \n \ :CtrlUp: LoadSelectedProc(-3) \n \ - :Ctrls: MenuItem(SaveGame) \n \ - :Ctrlc: MenuItem(CopyGame) \n \ - :Ctrlv: MenuItem(PasteGame) \n \ - :CtrlO: MenuItem(LoadPosition) \n \ + :Ctrls: MenuItem(File.SaveGame) \n \ + :Ctrlc: MenuItem(Edit.CopyGame) \n \ + :Ctrlv: MenuItem(Edit.PasteGame) \n \ + :CtrlO: MenuItem(File.LoadPosition) \n \ :ShiftNext: MenuItem(LoadNextPositionProc) \n \ :ShiftPrior: MenuItem(LoadPrevPositionProc) \n \ - :CtrlS: MenuItem(SavePosition) \n \ - :CtrlC: MenuItem(CopyPosition) \n \ - :CtrlV: MenuItem(PastePosition) \n \ - :Ctrlq: MenuItem(Exit) \n \ - :Ctrlw: MenuItem(MachineWhite) \n \ - :Ctrlb: MenuItem(MachineBlack) \n \ - :Ctrlt: MenuItem(TwoMachines) \n \ - :Ctrla: MenuItem(AnalysisMode) \n \ - :Ctrlg: MenuItem(AnalyzeFile) \n \ - :Ctrle: MenuItem(EditGame) \n \ - :CtrlE: MenuItem(EditPosition) \n \ - :MetaO: MenuItem(ShowEngineOutput) \n \ - :MetaE: MenuItem(ShowEvaluationGraph) \n \ - :MetaG: MenuItem(ShowGameList) \n \ - :MetaH: MenuItem(ShowMoveHistory) \n \ - :Pause: MenuItem(Pause) \n \ - :F3: MenuItem(Accept) \n \ - :F4: MenuItem(Decline) \n \ - :F12: MenuItem(Rematch) \n \ - :F5: MenuItem(CallFlag) \n \ - :F6: MenuItem(Draw) \n \ - :F7: MenuItem(Adjourn) \n \ - :F8: MenuItem(Abort) \n \ - :F10: MenuItem(StopObserving) \n \ - :F11: MenuItem(StopExamining) \n \ + :CtrlS: MenuItem(File.SavePosition) \n \ + :CtrlC: MenuItem(Edit.CopyPosition) \n \ + :CtrlV: MenuItem(Edit.PastePosition) \n \ + :Ctrlq: MenuItem(File.Quit) \n \ + :Ctrlw: MenuItem(Mode.MachineWhite) \n \ + :Ctrlb: MenuItem(Mode.MachineBlack) \n \ + :Ctrlt: MenuItem(Mode.TwoMachines) \n \ + :Ctrla: MenuItem(Mode.AnalysisMode) \n \ + :Ctrlg: MenuItem(Mode.AnalyzeFile) \n \ + :Ctrle: MenuItem(Mode.EditGame) \n \ + :CtrlE: MenuItem(Mode.EditPosition) \n \ + :MetaO: MenuItem(View.EngineOutput) \n \ + :MetaE: MenuItem(View.EvaluationGraph) \n \ + :MetaG: MenuItem(View.GameList) \n \ + :MetaH: MenuItem(View.MoveHistory) \n \ + :Pause: MenuItem(Mode.Pause) \n \ + :F3: MenuItem(Action.Accept) \n \ + :F4: MenuItem(Action.Decline) \n \ + :F12: MenuItem(Action.Rematch) \n \ + :F5: MenuItem(Action.CallFlag) \n \ + :F6: MenuItem(Action.Draw) \n \ + :F7: MenuItem(Action.Adjourn) \n \ + :F8: MenuItem(Action.Abort) \n \ + :F10: MenuItem(Action.StopObserving) \n \ + :F11: MenuItem(Action.StopExamining) \n \ :Ctrld: MenuItem(DebugProc) \n \ :Meta CtrlF12: MenuItem(DebugProc) \n \ - :MetaEnd: MenuItem(ToEnd) \n \ - :MetaRight: MenuItem(Forward) \n \ - :MetaHome: MenuItem(ToStart) \n \ - :MetaLeft: MenuItem(Backward) \n \ - :Left: MenuItem(Backward) \n \ - :Right: MenuItem(Forward) \n \ - :Home: MenuItem(Revert) \n \ - :End: MenuItem(TruncateGame) \n \ - :Ctrlm: MenuItem(MoveNow) \n \ - :Ctrlx: MenuItem(RetractMove) \n \ - :MetaJ: MenuItem(Adjudications) \n \ - :MetaU: MenuItem(CommonEngine) \n \ - :MetaT: MenuItem(TimeControl) \n \ + :MetaEnd: MenuItem(Edit.ForwardtoEnd) \n \ + :MetaRight: MenuItem(Edit.Forward) \n \ + :MetaHome: MenuItem(Edit.BacktoStart) \n \ + :MetaLeft: MenuItem(Edit.Backward) \n \ + :Left: MenuItem(Edit.Backward) \n \ + :Right: MenuItem(Edit.Forward) \n \ + :Home: MenuItem(Edit.Revert) \n \ + :End: MenuItem(Edit.TruncateGame) \n \ + :Ctrlm: MenuItem(Engine.MoveNow) \n \ + :Ctrlx: MenuItem(Engine.RetractMove) \n \ + :MetaJ: MenuItem(Options.Adjudications) \n \ + :MetaU: MenuItem(Options.CommonEngine) \n \ + :MetaT: MenuItem(Options.TimeControl) \n \ :CtrlP: MenuItem(PonderNextMove) \n " #ifndef OPTIONSDIALOG "\ @@ -604,36 +495,11 @@ char globalTranslations[] = :CtrlH: MenuItem(HideThinkingProc) \n " #endif "\ - :F1: MenuItem(Manual) \n \ - :F2: MenuItem(FlipView) \n \ + :F1: MenuItem(Help.ManXBoard) \n \ + :F2: MenuItem(View.FlipView) \n \ :Return: TempBackwardProc() \n \ :Return: TempForwardProc() \n"; -char boardTranslations[] = - ": HandleUserMove(0) \n \ - Shift: HandleUserMove(1) \n \ - : 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) \ - PieceMenuPopup(menuW) \n \ - Shift: XawPositionSimpleMenu(menuW) XawPositionSimpleMenu(menuD)\ - PieceMenuPopup(menuW) \n \ - Any: XawPositionSimpleMenu(menuB) XawPositionSimpleMenu(menuD) \ - PieceMenuPopup(menuB) \n"; - -char whiteTranslations[] = - "Shift: WhiteClock(1)\n \ - : WhiteClock(0)\n"; -char blackTranslations[] = - "Shift: BlackClock(1)\n \ - : BlackClock(0)\n"; - char ICSInputTranslations[] = "Up: UpKeyProc() \n " "Down: DownKeyProc() \n " @@ -807,9 +673,6 @@ BoardToTop () #define OPTCHAR "-" #define SEPCHAR " " -// these two must some day move to frontend.h, when they are implemented -Boolean GameListIsUp(); - // The option definition and parsing code common to XBoard and WinBoard is collected in this file #include "args.h" @@ -971,7 +834,6 @@ ParseCommPortSettings (char *s) { // no such option in XBoard (yet) } -extern Widget engineOutputShell; int frameX, frameY; void @@ -1001,10 +863,10 @@ 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); - if(MoveHistoryIsUp()) GetActualPlacement(shells[HistoryDlg], &wpMoveHistory); - if(EvalGraphIsUp()) GetActualPlacement(evalGraphShell, &wpEvalGraph); - if(GameListIsUp()) GetActualPlacement(gameListShell, &wpGameList); + if(shellUp[EngOutDlg]) GetActualPlacement(shells[EngOutDlg], &wpEngineOutput); + if(shellUp[HistoryDlg]) GetActualPlacement(shells[HistoryDlg], &wpMoveHistory); + if(shellUp[EvalGraphDlg]) GetActualPlacement(shells[EvalGraphDlg], &wpEvalGraph); + if(shellUp[GameListDlg]) GetActualPlacement(shells[GameListDlg], &wpGameList); if(shellUp[CommentDlg]) GetActualPlacement(shells[CommentDlg], &wpComment); if(shellUp[TagsDlg]) GetActualPlacement(shells[TagsDlg], &wpTags); } @@ -1026,6 +888,16 @@ MainWindowUp () return xBoardWindow != 0; } +void SwitchWindow() +{ + extern Option dualOptions[]; + static Window dual; + Window tmp = xBoardWindow; + if(!dual) dual = XtWindow(dualOptions[3].handle); // must be first call + xBoardWindow = dual; // swap them + dual = tmp; +} + void PopUpStartupDialog () { // start menu not implemented in XBoard @@ -1054,9 +926,6 @@ ConvertToLine (int argc, char **argv) //-------------------------------------------------------------------------------------------- -#ifdef IDSIZES - // eventually, all layout determining code should go into a subroutine, but until then IDSIZE remains undefined -#else #define BoardSize int void InitDrawingSizes (BoardSize boardSize, int flags) @@ -1067,7 +936,7 @@ InitDrawingSizes (BoardSize boardSize, int flags) int i; static Dimension oldWidth, oldHeight; static VariantClass oldVariant; - static int oldDual = -1, oldMono = -1; + static int oldMono = -1; if(!formWidget) return; @@ -1075,68 +944,15 @@ InitDrawingSizes (BoardSize boardSize, int flags) 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. - */ - shellArgs[0].value = (XtArgVal) &w; - shellArgs[1].value = (XtArgVal) &h; - XtGetValues(shellWidget, shellArgs, 2); - - shellArgs[4].value = 3*w; shellArgs[2].value = 10; - shellArgs[5].value = 2*h; shellArgs[3].value = 10; - XtSetValues(shellWidget, &shellArgs[2], 4); - - XtSetArg(args[0], XtNdefaultDistance, &sep); - XtGetValues(formWidget, args, 1); + if(boardWidth != oldWidth || boardHeight != oldHeight) { // do resizing stuff only if size actually changed - oldWidth = boardWidth; oldHeight = boardHeight; oldDual = twoBoards; + oldWidth = boardWidth; oldHeight = boardHeight; CreateGrid(); - hOffset = boardWidth + 10; - for(i=0; i 0) { - XtSetArg(args[0], XtNx, wpMain.x); - XtSetArg(args[1], XtNy, wpMain.y); - XtSetValues(shellWidget, args, 2); - } - - /* - * Correct the width of the message and title widgets. - * It is not known why some systems need the extra fudge term. - * The value "2" is probably larger than needed. - */ - XawFormDoLayout(formWidget, False); - -#define WIDTH_FUDGE 2 - i = 0; - XtSetArg(args[i], XtNborderWidth, &bor); i++; - XtSetArg(args[i], XtNheight, &h); i++; - XtGetValues(messageWidget, args, i); - if (appData.showButtonBar) { - i = 0; - XtSetArg(args[i], XtNwidth, &w); i++; - XtGetValues(buttonBarWidget, args, i); - w = boardWidth - w - sep - 2*bor - WIDTH_FUDGE; - } else { - w = boardWidth - 2*bor + 1; /*!! +1 compensates for kludge below */ - } - - gres = XtMakeResizeRequest(messageWidget, w, h, &wr, &hr); - if (gres != XtGeometryYes && appData.debugMode) { - fprintf(stderr, _("%s: messageWidget geometry error %d %d %d %d %d\n"), - programName, gres, w, h, wr, hr); - } - - /* !! Horrible hack to work around bug in XFree86 4.0.1 (X11R6.4.3) */ - /* The size used for the child widget in layout lags one resize behind - its true size, so we resize a second time, 1 pixel smaller. Yeech! */ - w--; - gres = XtMakeResizeRequest(messageWidget, w, h, &wr, &hr); - if (gres != XtGeometryYes && appData.debugMode) { - fprintf(stderr, _("%s: messageWidget geometry error %d %d %d %d %d\n"), - programName, gres, w, h, wr, hr); + XtGetValues(optList[18].handle, args, 2); } - /* !! 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); - - if (appData.titleInWindow) { - i = 0; - XtSetArg(args[i], XtNborderWidth, &bor); i++; - XtSetArg(args[i], XtNheight, &h); i++; - XtGetValues(titleWidget, args, i); - if (smallLayout) { - w = boardWidth - 2*bor; - } else { - XtSetArg(args[0], XtNwidth, &w); - XtGetValues(menuBarWidget, args, 1); - w = boardWidth - w - sep - 2*bor - WIDTH_FUDGE; - } - - gres = XtMakeResizeRequest(titleWidget, w, h, &wr, &hr); - if (gres != XtGeometryYes && appData.debugMode) { - fprintf(stderr, - _("%s: titleWidget geometry error %d %d %d %d %d\n"), - programName, gres, w, h, wr, hr); - } - } - XawFormDoLayout(formWidget, True); + AppendEnginesToMenu(appData.recentEngineList); xBoardWindow = XtWindow(boardWidget); // [HGM] it seems the layout code ends here, but perhaps the color stuff is size independent and would // not need to go into InitDrawingSizes(). -#endif /* * Create X checkmark bitmap and initialize option menu checks. @@ -1871,25 +1464,12 @@ XBoard square size (hint): %d\n\ CreateGrid(); CreateAnyPieces(); - CreatePieceMenus(); - if (appData.animate || appData.animateDragging) CreateAnimVars(); XtAugmentTranslations(formWidget, XtParseTranslationTable(globalTranslations)); - XtAugmentTranslations(boardWidget, - XtParseTranslationTable(boardTranslations)); - XtAugmentTranslations(whiteTimerWidget, - XtParseTranslationTable(whiteTranslations)); - XtAugmentTranslations(blackTimerWidget, - XtParseTranslationTable(blackTranslations)); - - /* Why is the following needed on some versions of X instead - * of a translation? */ - XtAddEventHandler(boardWidget, ExposureMask|PointerMotionMask, False, - (XtEventHandler) EventProc, NULL); - /* end why */ + XtAddEventHandler(formWidget, KeyPressMask, False, (XtEventHandler) MoveTypeInProc, NULL); XtAddEventHandler(shellWidget, StructureNotifyMask, False, @@ -2692,64 +2272,30 @@ CreateGrid () } } -int nrOfMenuItems = 7; -Widget menuWidget[150]; -MenuListItem menuItemList[150] = { - { "LoadNextGameProc", LoadNextGameProc }, - { "LoadPrevGameProc", LoadPrevGameProc }, - { "ReloadGameProc", ReloadGameProc }, - { "ReloadPositionProc", ReloadPositionProc }, -#ifndef OPTIONSDIALOG - { "AlwaysQueenProc", AlwaysQueenProc }, - { "AnimateDraggingProc", AnimateDraggingProc }, - { "AnimateMovingProc", AnimateMovingProc }, - { "AutoflagProc", AutoflagProc }, - { "AutoflipProc", AutoflipProc }, - { "BlindfoldProc", BlindfoldProc }, - { "FlashMovesProc", FlashMovesProc }, -#if HIGHDRAG - { "HighlightDraggingProc", HighlightDraggingProc }, -#endif - { "HighlightLastMoveProc", HighlightLastMoveProc }, -// { "IcsAlarmProc", IcsAlarmProc }, - { "MoveSoundProc", MoveSoundProc }, - { "PeriodicUpdatesProc", PeriodicUpdatesProc }, - { "PopupExitMessageProc", PopupExitMessageProc }, - { "PopupMoveErrorsProc", PopupMoveErrorsProc }, -// { "PremoveProc", PremoveProc }, - { "ShowCoordsProc", ShowCoordsProc }, - { "ShowThinkingProc", ShowThinkingProc }, - { "HideThinkingProc", HideThinkingProc }, - { "TestLegalityProc", TestLegalityProc }, -#endif - { "AboutGameProc", AboutGameEvent }, - { "DebugProc", DebugProc }, - { "NothingProc", NothingProc }, - {NULL, NothingProc} -}; - void MarkMenuItem (char *menuRef, int state) { - int nr = MenuToNumber(menuRef); - if(nr >= 0) { + MenuItem *item = MenuNameToItem(menuRef); + + if(item) { Arg args[2]; XtSetArg(args[0], XtNleftBitmap, state ? xMarkPixmap : None); - XtSetValues(menuWidget[nr], args, 1); + XtSetValues(item->handle, args, 1); } } void EnableMenuItem (char *menuRef, int state) { - int nr = MenuToNumber(menuRef); - if(nr >= 0) XtSetSensitive(menuWidget[nr], state); + MenuItem *item = MenuNameToItem(menuRef); + + if(item) XtSetSensitive(item->handle, state); } void EnableButtonBar (int state) { - XtSetSensitive(buttonBarWidget, state); + XtSetSensitive(optList[15].handle, state); } @@ -2762,27 +2308,15 @@ SetMenuEnables (Enables *enab) } } -int -Equal(char *p, char *s) -{ // compare strings skipping spaces in second - while(*s) { - if(*s == ' ') { s++; continue; } - if(*s++ != *p++) return 0; - } - return !*p; -} - void KeyBindingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { // [HGM] new method of key binding: specify MenuItem(FlipView) in stead of FlipViewProc in translation string int i; + char *p; + MenuItem *item; if(*nprms == 0) return; - for(i=0; menuItemList[i].name; i++) { - if(Equal(prms[0], menuItemList[i].name)) { - (menuItemList[i].proc) (); - return; - } - } + item = MenuNameToItem(prms[0]); + if(item) ((MenuProc *) item->proc) (); } static void @@ -2799,194 +2333,10 @@ MenuEngineSelect (Widget w, caddr_t addr, caddr_t index) RecentEngineEvent((int) (intptr_t) addr); } -// some stuff that must remain in front-end -static Widget mainBar, currentMenu; -static int wtot, nr = 0, widths[10]; - void -AppendMenuItem (char *text, char *name, MenuProc *action) +AppendMenuItem (char *msg, int n) { - int j; - Widget entry; - Arg args[16]; - - j = 0; - XtSetArg(args[j], XtNleftMargin, 20); j++; - XtSetArg(args[j], XtNrightMargin, 20); j++; - - if (strcmp(text, "----") == 0) { - entry = XtCreateManagedWidget(text, smeLineObjectClass, - currentMenu, args, j); - } else { - XtSetArg(args[j], XtNlabel, XtNewString(_(text))); - entry = XtCreateManagedWidget(name, smeBSBObjectClass, - currentMenu, args, j+1); - XtAddCallback(entry, XtNcallback, - (XtCallbackProc) (strcmp(name, "recent") ? MenuBarSelect : MenuEngineSelect), - (caddr_t) action); - menuWidget[nrOfMenuItems] = entry; - } -} - -void -CreateMenuButton (char *name, Menu *mb) -{ // create menu button on main bar, and shell for pull-down list - int i, j; - Arg args[16]; - Dimension w; - - j = 0; - XtSetArg(args[j], XtNmenuName, XtNewString(name)); j++; - XtSetArg(args[j], XtNlabel, XtNewString(_(mb->name))); j++; - XtSetArg(args[j], XtNborderWidth, 0); j++; - mb->subMenu = XtCreateManagedWidget(mb->name, menuButtonWidgetClass, - mainBar, args, j); - currentMenu = XtCreatePopupShell(name, simpleMenuWidgetClass, - mainBar, NULL, 0); - j = 0; - XtSetArg(args[j], XtNwidth, &w); j++; - XtGetValues(mb->subMenu, args, j); - wtot += mb->textWidth = widths[nr++] = w; -} - -Widget -CreateMenuBar (Menu *mb, int boardWidth) -{ - int i, j; - Arg args[16]; - char menuName[MSG_SIZ]; - Dimension w; - Menu *ma = mb; - - // create bar itself - j = 0; - XtSetArg(args[j], XtNorientation, XtorientHorizontal); j++; - XtSetArg(args[j], XtNvSpace, 0); j++; - XtSetArg(args[j], XtNborderWidth, 0); j++; - mainBar = XtCreateWidget("menuBar", boxWidgetClass, - formWidget, args, j); - - CreateMainMenus(mb); // put menus in bar according to description in back-end - - // size buttons to make menu bar fit, clipping menu names where necessary - while(wtot > boardWidth - 40) { - int wmax=0, imax=0; - for(i=0; i wmax) wmax = widths[imax=i]; - widths[imax]--; - wtot--; - } - for(i=0; istring != NULL) { - j = 0; - if (tinyLayout) { - XtSetArg(args[j], XtNinternalWidth, 2); j++; - XtSetArg(args[j], XtNborderWidth, 0); j++; - } - XtSetArg(args[j], XtNlabel, XtNewString(_(mi->string))); j++; - button = XtCreateManagedWidget(mi->string, commandWidgetClass, - buttonBar, args, j); - XtAddCallback(button, XtNcallback, - (XtCallbackProc) MenuBarSelect, - (caddr_t) mi->proc); - mi++; - } - return buttonBar; -} - -Widget -CreatePieceMenu (char *name, int color) -{ - int i; - Widget entry, menu; - Arg args[16]; - ChessSquare selection; - - menu = XtCreatePopupShell(name, simpleMenuWidgetClass, - boardWidget, args, 0); - - for (i = 0; i < PIECE_MENU_SIZE; i++) { - String item = pieceMenuStrings[color][i]; - - if (strcmp(item, "----") == 0) { - entry = XtCreateManagedWidget(item, smeLineObjectClass, - menu, NULL, 0); - } else { - XtSetArg(args[0], XtNlabel, XtNewString(_(item))); - entry = XtCreateManagedWidget(item, smeBSBObjectClass, - menu, args, 1); - selection = pieceMenuTranslation[color][i]; - XtAddCallback(entry, XtNcallback, - (XtCallbackProc) PieceMenuSelect, - (caddr_t) selection); - if (selection == WhitePawn || selection == BlackPawn) { - XtSetArg(args[0], XtNpopupOnEntry, entry); - XtSetValues(menu, args, 1); - } - } - } - return menu; -} - -void -CreatePieceMenus () -{ - int i; - Widget entry; - Arg args[16]; - ChessSquare selection; - - whitePieceMenu = CreatePieceMenu("menuW", 0); - blackPieceMenu = CreatePieceMenu("menuB", 1); - - if(appData.pieceMenu) // [HGM] sweep: no idea what this was good for, but it stopped reporting button events outside the window - XtRegisterGrabAction(PieceMenuPopup, True, - (unsigned)(ButtonPressMask|ButtonReleaseMask), - GrabModeAsync, GrabModeAsync); - - XtSetArg(args[0], XtNlabel, _("Drop")); - dropMenu = XtCreatePopupShell("menuD", simpleMenuWidgetClass, - boardWidget, args, 1); - for (i = 0; i < DROP_MENU_SIZE; i++) { - String item = dropMenuStrings[i]; - - if (strcmp(item, "----") == 0) { - entry = XtCreateManagedWidget(item, smeLineObjectClass, - dropMenu, NULL, 0); - } else { - XtSetArg(args[0], XtNlabel, XtNewString(_(item))); - entry = XtCreateManagedWidget(item, smeBSBObjectClass, - dropMenu, args, 1); - selection = dropMenuTranslation[i]; - XtAddCallback(entry, XtNcallback, - (XtCallbackProc) DropMenuSelect, - (caddr_t) selection); - } - } + CreateMenuItem((Widget) optList[6].textValue, msg, (XtCallbackProc) MenuEngineSelect, n); } void @@ -3014,53 +2364,6 @@ SetupDropMenu () } } -void -PieceMenuPopup (Widget w, XEvent *event, String *params, Cardinal *num_params) -{ - String whichMenu; int menuNr = -2; - shiftKey = strcmp(params[0], "menuW"); // used to indicate black - if (event->type == ButtonRelease) - menuNr = RightClick(Release, event->xbutton.x, event->xbutton.y, &pmFromX, &pmFromY); - else if (event->type == ButtonPress) - menuNr = RightClick(Press, event->xbutton.x, event->xbutton.y, &pmFromX, &pmFromY); - switch(menuNr) { - case 0: whichMenu = params[0]; break; - case 1: SetupDropMenu(); whichMenu = "menuD"; break; - case 2: - case -1: ErrorPopDown(); - default: return; - } - XtPopupSpringLoaded(XtNameToWidget(boardWidget, whichMenu)); -} - -static void -PieceMenuSelect (Widget w, ChessSquare piece, caddr_t junk) -{ - if (pmFromX < 0 || pmFromY < 0) return; - EditPositionMenuEvent(piece, pmFromX, pmFromY); -} - -static void -DropMenuSelect (Widget w, ChessSquare piece, caddr_t junk) -{ - if (pmFromX < 0 || pmFromY < 0) return; - DropMenuEvent(piece, pmFromX, pmFromY); -} - -void -WhiteClock (Widget w, XEvent *event, String *prms, Cardinal *nprms) -{ - shiftKey = prms[0][0] & 1; - ClockClick(0); -} - -void -BlackClock (Widget w, XEvent *event, String *prms, Cardinal *nprms) -{ - shiftKey = prms[0][0] & 1; - ClockClick(1); -} - static void do_flash_delay (unsigned long msec) @@ -3390,10 +2693,10 @@ DragProc () 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[HistoryDlg], &wpMoveHistory); - if(EvalGraphIsUp()) CoDrag(evalGraphShell, &wpEvalGraph); - if(GameListIsUp()) CoDrag(gameListShell, &wpGameList); + if(shellUp[EngOutDlg]) CoDrag(shells[EngOutDlg], &wpEngineOutput); + if(shellUp[HistoryDlg]) CoDrag(shells[HistoryDlg], &wpMoveHistory); + if(shellUp[EvalGraphDlg]) CoDrag(shells[EvalGraphDlg], &wpEvalGraph); + if(shellUp[GameListDlg]) CoDrag(shells[GameListDlg], &wpGameList); wpMain = wpNew; DrawPosition(True, NULL); delayedDragID = 0; // now drag executed, make sure next DelayedDrag will not cancel timer event (which could now be used by other) @@ -3408,33 +2711,12 @@ DelayedDrag () 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 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 */ - DrawPosition(True, NULL); - if(twoBoards) { // [HGM] dual: draw other board in other orientation - flipView = !flipView; partnerUp = !partnerUp; - DrawPosition(True, NULL); - flipView = !flipView; partnerUp = !partnerUp; - } - break; - case MotionNotify: - if(SeekGraphClick(Press, event->xbutton.x, event->xbutton.y, 1)) break; - default: - return; - } + if(XtIsRealized(widget) && event->type == ConfigureNotify || appData.useStickyWindows) + DelayedDrag(); // as long as events keep coming in faster than 50 msec, they destroy each other } -/* end why */ // [HGM] seekgraph: some low-level drawing routines cloned from xevalgraph void @@ -3471,10 +2753,9 @@ DrawSeekDot (int x, int y, int colorNr) } void -DrawGrid (int second) +DrawGrid () { XDrawSegments(xDisplay, xBoardWindow, lineGC, - second ? secondSegments : // [HGM] dual gridSegments, BOARD_HEIGHT + BOARD_WIDTH + 2); } @@ -3489,44 +2770,6 @@ DrawPositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) } -/* - * event handler for parsing user moves - */ -// [HGM] This routine will need quite some reworking. Although the backend still supports the old -// way of doing things, by calling UserMoveEvent() to test the legality of the move and then perform -// it at the end, and doing all kind of preliminary tests here (e.g. to weed out self-captures), it -// should be made to use the new way, of calling UserMoveTest early to determine the legality of the -// 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 (Widget w, XEvent *event, String *prms, Cardinal *nprms) -{ - if (w != boardWidget || errorExitStatus != -1) return; - if(nprms) shiftKey = !strcmp(prms[0], "1"); - - if (shellUp[PromoDlg]) { // [HGM] is this still needed? - if (event->type == ButtonPress) { - PopDown(PromoDlg); - ClearHighlights(); - fromX = fromY = -1; - } else { - return; - } - } - - // [HGM] mouse: the rest of the mouse handler is moved to the backend, and called here - if(event->type == ButtonPress) LeftClick(Press, event->xbutton.x, event->xbutton.y); - if(event->type == ButtonRelease) LeftClick(Release, event->xbutton.x, event->xbutton.y); -} - -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) { // [HGM] pv: walk PV @@ -3587,10 +2830,7 @@ FileNamePopUp (char *label, char *def, char *filter, FileProc proc, char *openMo fileOpenMode = openMode; /* to use globals here */ { // [HGM] use file-selector dialog stolen from Ghostview int index; // this is not supported yet - 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); + Browse(BoardWindow, label, (def[0] ? def : NULL), filter, False, openMode, &openName, &openFP); } } @@ -3603,7 +2843,7 @@ FreezeUI () { if (frozen) return; /* Grab by a widget that doesn't accept input */ - XtAddGrab(messageWidget, TRUE, FALSE); + XtAddGrab(optList[14].handle, TRUE, FALSE); frozen = 1; } @@ -3612,7 +2852,7 @@ void ThawUI () { if (!frozen) return; - XtRemoveGrab(messageWidget); + XtRemoveGrab(optList[14].handle); frozen = 0; } @@ -3628,7 +2868,7 @@ ModeHighlight () if (pausing != oldPausing) { oldPausing = pausing; - MarkMenuItem("Pause", pausing); + MarkMenuItem("Mode.Pause", pausing); if (appData.showButtonBar) { /* Always toggle, don't set. Previous code messes up when @@ -3638,12 +2878,12 @@ ModeHighlight () Pixel oldbg, oldfg; XtSetArg(args[0], XtNbackground, &oldbg); XtSetArg(args[1], XtNforeground, &oldfg); - XtGetValues(XtNameToWidget(buttonBarWidget, PAUSE_BUTTON), + XtGetValues(optList[18].handle, args, 2); XtSetArg(args[0], XtNbackground, oldfg); XtSetArg(args[1], XtNforeground, oldbg); } - XtSetValues(XtNameToWidget(buttonBarWidget, PAUSE_BUTTON), args, 2); + XtSetValues(optList[18].handle, args, 2); } } @@ -3656,34 +2896,16 @@ ModeHighlight () MarkMenuItem(wname, True); } oldmode = gameMode; - MarkMenuItem("Machine Match", matchMode && matchGame < appData.matchGames); + MarkMenuItem("Mode.MachineMatch", matchMode && matchGame < appData.matchGames); /* Maybe all the enables should be handled here, not just this one */ - EnableMenuItem("Training", gameMode == Training || gameMode == PlayFromGameFile); + EnableMenuItem("Mode.Training", gameMode == Training || gameMode == PlayFromGameFile); } /* * Button/menu procedures */ -int -LoadGamePopUp (FILE *f, int gameNumber, char *title) -{ - cmailMsgLoaded = FALSE; - if (gameNumber == 0) { - int error = GameListBuild(f); - if (error) { - DisplayError(_("Cannot build game list"), error); - } else if (!ListEmpty(&gameList) && - ((ListGame *) gameList.tailPred)->number > 1) { - GameListPopUp(f, title); - return TRUE; - } - GameListDestroy(); - gameNumber = 1; - } - return LoadGame(f, gameNumber, title, FALSE); -} /* this variable is shared between CopyPositionProc and SendPositionSelection */ char *selected_fen_position=NULL; @@ -3937,41 +3159,6 @@ ManInner (Widget w, XEvent *event, String *prms, Cardinal *nprms) } void -DisplayMessage (char *message, char *extMessage) -{ - /* display a message in the message widget */ - - char buf[MSG_SIZ]; - Arg arg; - - if (extMessage) - { - if (*message) - { - snprintf(buf, sizeof(buf), "%s %s", message, extMessage); - message = buf; - } - else - { - 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 */ - if(messageWidget) - { - XtSetArg(arg, XtNlabel, message); - XtSetValues(messageWidget, &arg, 1); - }; - - return; -} - -void SetWindowTitle (char *text, char *title, char *icon) { Arg args[16]; @@ -4160,10 +3347,11 @@ StartClockTimer (long millisec) } void -DisplayTimerLabel (Widget w, char *color, long timer, int highlight) +DisplayTimerLabel (Option *opt, char *color, long timer, int highlight) { char buf[MSG_SIZ]; Arg args[16]; + Widget w = (Widget) opt->handle; /* check for low time warning */ Pixel foregroundOrWarningColor = timerForegroundPixel; @@ -4193,29 +3381,15 @@ DisplayTimerLabel (Widget w, char *color, long timer, int highlight) XtSetValues(w, args, 3); } -void -DisplayWhiteClock (long timeRemaining, int highlight) -{ - Arg args[16]; - - if(appData.noGUI) return; - DisplayTimerLabel(whiteTimerWidget, _("White"), timeRemaining, highlight); - if (highlight && iconPixmap == bIconPixmap) { - iconPixmap = wIconPixmap; - XtSetArg(args[0], XtNiconPixmap, iconPixmap); - XtSetValues(shellWidget, args, 1); - } -} +static Pixmap *clockIcons[] = { &wIconPixmap, &bIconPixmap }; void -DisplayBlackClock (long timeRemaining, int highlight) +SetClockIcon (int color) { Arg args[16]; - - if(appData.noGUI) return; - DisplayTimerLabel(blackTimerWidget, _("Black"), timeRemaining, highlight); - if (highlight && iconPixmap == wIconPixmap) { - iconPixmap = bIconPixmap; + Pixmap pm = *clockIcons[color]; + if (iconPixmap != pm) { + iconPixmap = pm; XtSetArg(args[0], XtNiconPixmap, iconPixmap); XtSetValues(shellWidget, args, 1); }