X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xboard.c;h=f29eb15f6a9386dcee119f2c4785c80b82021a63;hb=e70077aab0199817f37aef9ed0bdba1bbca93b45;hp=e2a48f7f6ed21b36b1b4c4375b15dfb9c174c8ca;hpb=33c2b32d895ba5b4633500928d0b8422e92b1b31;p=xboard.git diff --git a/xboard.c b/xboard.c index e2a48f7..f29eb15 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: @@ -238,6 +238,8 @@ typedef struct { String name; String ref; MenuItem *mi; + int textWidth; + Widget subMenu; } Menu; int main P((int argc, char **argv)); @@ -253,7 +255,7 @@ 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)); @@ -387,6 +389,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)); @@ -980,6 +985,8 @@ XtActionsRec boardActions[] = { { "UploadProc", UploadProc }, { "BackwardProc", BackwardProc }, { "ForwardProc", ForwardProc }, + { "TempBackwardProc", TempBackwardProc }, + { "TempForwardProc", TempForwardProc }, { "ToStartProc", ToStartProc }, { "ToEndProc", ToEndProc }, { "RevertProc", RevertProc }, @@ -1108,8 +1115,8 @@ char globalTranslations[] = "\ :F1: ManProc() \n \ :F2: FlipViewProc() \n \ - :Ctrl.: BackwardProc() \n \ - :Ctrl.: ForwardProc() \n \ + :Return: TempBackwardProc() \n \ + :Return: TempForwardProc() \n \ :Ctrl1: AskQuestionProc(\"Direct command\",\ \"Send to chess program:\",,1) \n \ :Ctrl2: AskQuestionProc(\"Direct command\",\ @@ -1681,7 +1688,7 @@ void InitDrawingSizes(BoardSize boardSize, int flags) int i; static Dimension oldWidth, oldHeight; static VariantClass oldVariant; - static int oldDual = -1; + static int oldDual = -1, oldMono = -1; if(!formWidget) return; @@ -1760,7 +1767,7 @@ void InitDrawingSizes(BoardSize boardSize, int flags) // [HGM] pieces: tailor piece bitmaps to needs of specific variant // (only for xpm) - if(gameInfo.variant == oldVariant) return; // and only if variant changed + if(gameInfo.variant != oldVariant) { // and only if variant changed if(useImages) { for(i=0; i<4; i++) { @@ -1828,9 +1835,12 @@ void InitDrawingSizes(BoardSize boardSize, int flags) } } } + } #if HAVE_LIBXPM + if(appData.monoMode == oldMono) CreateAnimVars(); #endif + oldMono = appData.monoMode; } #endif @@ -1938,7 +1948,7 @@ CreateAnyPieces() #if HAVE_LIBXPM if (appData.monoMode && // [HGM] no sense to go on to certain doom (appData.bitmapDirectory == NULL || appData.bitmapDirectory[0] == NULLCHAR)) - appData.bitmapDirectory = DEF_BITMAP_DIR; + appData.bitmapDirectory = strdup(DEF_BITMAP_DIR); if (appData.bitmapDirectory[0] != NULLCHAR) { CreatePieces(); @@ -2270,7 +2280,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); @@ -3941,13 +3951,16 @@ void CreateMenuBarPopup(parent, name, mb) } } -Widget CreateMenuBar(mb) +Widget CreateMenuBar(mb, boardWidth) 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++; @@ -3961,22 +3974,28 @@ 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; i 32) { *length_return *= *format_return / 32; *format_return = 32; } +#else + *format_return = 32; +#endif return True; } else { return False; @@ -5747,11 +5753,19 @@ 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; @@ -6241,6 +6255,37 @@ void BackwardProc(w, event, prms, nprms) BackwardEvent(); } +void TempBackwardProc(w, event, prms, nprms) + Widget w; + XEvent *event; + String *prms; + Cardinal *nprms; +{ + if (!TempBackwardActive) { + TempBackwardActive = True; + BackwardEvent(); + } +} + +void TempForwardProc(w, event, prms, nprms) + 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(w, event, prms, nprms) Widget w; XEvent *event; @@ -8872,7 +8917,7 @@ 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 ) { - XPoint arrow[7]; + XPoint arrow[8]; double dx, dy, j, k, x, y; if( d_x == s_x ) { @@ -8969,6 +9014,7 @@ 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 ); }