X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xhistory.c;h=c00a9b8b46a4a6e3b49e46d0aa69d6fa3dcfa540;hb=71c3de687d33523d83dec50208b0e44815fd7d20;hp=02c9ec3643c6eb94212be431c72a11f03b4e5b1a;hpb=7b4dacf6fe9f8c10b6eb4d6070869a3d933dbeb5;p=xboard.git diff --git a/xhistory.c b/xhistory.c index 02c9ec3..c00a9b8 100644 --- a/xhistory.c +++ b/xhistory.c @@ -1,7 +1,7 @@ /* * xhistory.c -- Move list window, part of X front end for XBoard * - * Copyright 2000,2009 Free Software Foundation, Inc. + * Copyright 2000, 2009, 2010, 2011 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify @@ -67,6 +67,7 @@ extern char *getenv(); #include "xboard.h" #include "xhistory.h" #include "gettext.h" +#include "xevalgraph.h" #ifdef ENABLE_NLS # define _(s) gettext (s) @@ -78,12 +79,6 @@ extern char *getenv(); #define _LL_ 100 -extern Widget formWidget, shellWidget, boardWidget, menuBarWidget; -extern Display *xDisplay; -extern int squareSize; -extern Pixmap xMarkPixmap; -extern char *layoutName; - struct History{ String *Nr,*white,*black; int aNr; /* space actually alocated */ @@ -94,6 +89,7 @@ struct History{ struct History *hist=0; String dots=" ... "; Position gameHistoryX, gameHistoryY; +Dimension gameHistoryW, gameHistoryH; void HistoryPopDown(w, client_data, call_data) @@ -103,18 +99,25 @@ HistoryPopDown(w, client_data, call_data) Arg args[16]; int j; if(hist) { + // [HGM] remember old position j = 0; XtSetArg(args[j], XtNx, &gameHistoryX); j++; XtSetArg(args[j], XtNy, &gameHistoryY); j++; + XtSetArg(args[j], XtNwidth, &gameHistoryW); j++; + XtSetArg(args[j], XtNheight, &gameHistoryH); j++; XtGetValues(hist->sh, args, j); + wpMoveHistory.x = gameHistoryX - 4; + wpMoveHistory.y = gameHistoryY - 23; + wpMoveHistory.width = gameHistoryW; + wpMoveHistory.height = gameHistoryH; XtPopdown(hist->sh); hist->Up=False; } j=0; XtSetArg(args[j], XtNleftBitmap, None); j++; - XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Show Move History"), + XtSetValues(XtNameToWidget(menuBarWidget, "menuView.Show Move History"), args, j); } @@ -164,7 +167,6 @@ void HistoryAlloc(int len){ } -#if 1 /* Find empty space inside vbox form widget and redistribute it amongst the list widgets inside it. */ /* This version sort of works */ @@ -213,61 +215,10 @@ HistoryFill() XtSetArg(args[j], XtNwidth, w); j++; XtSetValues(hist->mvb, args, j); } -#else -/* Find empty space inside vbox form widget and redistribute it amongst - the list widgets inside it. */ -/* This version doesn't work */ -void -HistoryFill() -{ - Arg args[16]; - Dimension fw, niw, wiw, biw, nbw, wbw, bbw; - int j, nl, wl, bl, fdd; - long extra; - - j = 0; - XtSetArg(args[j], XtNwidth, &fw); j++; - XtSetArg(args[j], XtNdefaultDistance, &fdd); j++; - XtGetValues(hist->vbox, args, j); - - j = 0; - XtSetArg(args[j], XtNlongest, &nl); j++; - XtSetArg(args[j], XtNinternalWidth, &niw); j++; - XtSetArg(args[j], XtNborderWidth, &nbw); j++; - XtGetValues(hist->mvn, args, j); - - j = 0; - XtSetArg(args[j], XtNlongest, &wl); j++; - XtSetArg(args[j], XtNinternalWidth, &wiw); j++; - XtSetArg(args[j], XtNborderWidth, &wbw); j++; - XtGetValues(hist->mvw, args, j); - - j = 0; - XtSetArg(args[j], XtNlongest, &bl); j++; - XtSetArg(args[j], XtNinternalWidth, &biw); j++; - XtSetArg(args[j], XtNborderWidth, &bbw); j++; - XtGetValues(hist->mvb, args, j); - - extra = fw - 4*fdd - - nl - 1 - 2*niw - 2*nbw - wl - 2*wiw - 2*wbw - bl - 2*biw - 2*bbw; - if (extra < 0) extra = 0; - - j = 0; - XtSetArg(args[j], XtNwidth, nl + 1 + 2*niw); j++; - XtSetValues(hist->mvn, args, j); - - j = 0; - XtSetArg(args[j], XtNwidth, wl + 2*wiw + extra/2); j++; - XtSetValues(hist->mvw, args, j); - - j = 0; - XtSetArg(args[j], XtNwidth, bl + 2*biw + extra/2); j++; - XtSetValues(hist->mvb, args, j); -} -#endif void HistorySet(char movelist[][2*MOVE_LEN],int first,int last,int current){ int i,b,m; + Widget scroll; if(hist){ if(last >= hist->aNr) HistoryAlloc(last+_LL_); for(i=0;iwhite[i/2+1], movelist[i], p-movelist[i]); hist->white[i/2+1][p-movelist[i]] = NULLCHAR; } else { - strcpy(hist->white[i/2+1],movelist[i]); + safeStrCpy(hist->white[i/2+1],movelist[i], MOVE_LEN); } } else { - strcpy(hist->white[i/2+1],dots); + safeStrCpy(hist->white[i/2+1],dots, MOVE_LEN); } } else { if(movelist[i][0]) { @@ -290,14 +241,14 @@ void HistorySet(char movelist[][2*MOVE_LEN],int first,int last,int current){ strncpy(hist->black[i/2+1], movelist[i], p-movelist[i]); hist->black[i/2+1][p-movelist[i]] = NULLCHAR; } else { - strcpy(hist->black[i/2+1],movelist[i]); + safeStrCpy(hist->black[i/2+1],movelist[i], MOVE_LEN); } } else { - strcpy(hist->black[i/2+1],""); + safeStrCpy(hist->black[i/2+1],"", MOVE_LEN); } } } - strcpy(hist->black[last/2+1],""); + safeStrCpy(hist->black[last/2+1],"", MOVE_LEN); b=first/2; m=(last+3)/2-b; XawFormDoLayout(hist->vbox, False); @@ -319,7 +270,15 @@ void HistorySet(char movelist[][2*MOVE_LEN],int first,int last,int current){ if(current) XawListHighlight(hist->mvb, current/2+1); else XawListUnhighlight(hist->mvb); } + if(scroll = XtNameToWidget(hist->sh, "*form.viewport.vertical")) { // [HGM] always scroll to bottom + static char *params[3] = { "", "Forward", "FullLength" }; + static XEvent event; + XtCallActionProc(scroll, "StartScroll", &event, params+1, 1); + XtCallActionProc(scroll, "NotifyScroll", &event, params+2, 1); + XtCallActionProc(scroll, "EndScroll", &event, params, 0); + } } + EvalGraphSet( first, last, current, pvInfoList ); // piggy-backed } Widget HistoryCreate() @@ -341,11 +300,11 @@ Widget HistoryCreate() XtSetArg(args[j], XtNresizable, True); j++; XtSetArg(args[j], XtNallowShellResize, True); j++; #if TOPLEVEL - hist->sh = + hist->sh = historyShell = XtCreatePopupShell(_("Move list"), topLevelShellWidgetClass, shellWidget, args, j); #else - hist->sh = + hist->sh = historyShell = XtCreatePopupShell(_("Move list"), transientShellWidgetClass, shellWidget, args, j); #endif @@ -362,10 +321,8 @@ Widget HistoryCreate() form = XtCreateManagedWidget("form", formWidgetClass, layout, args, j); - j=0; j = 0; - XtSetArg(args[j], XtNtop, XtChainTop); j++; XtSetArg(args[j], XtNbottom, XtChainBottom); j++; XtSetArg(args[j], XtNleft, XtChainLeft); j++; @@ -450,10 +407,28 @@ Widget HistoryCreate() CatchDeleteWindow(hist->sh, "HistoryPopDown"); for(i=1;iaNr;i++){ - strcpy(hist->white[i],dots); - strcpy(hist->black[i],""); + safeStrCpy(hist->white[i],dots, MOVE_LEN); + safeStrCpy(hist->black[i],"", MOVE_LEN); } + if(wpMoveHistory.width > 0) { + gameHistoryW = wpMoveHistory.width; + gameHistoryH = wpMoveHistory.height; + gameHistoryX = wpMoveHistory.x; + gameHistoryY = wpMoveHistory.y; + } + + // [HGM] restore old position + if(gameHistoryW > 0) { + j = 0; + XtSetArg(args[j], XtNx, gameHistoryX); j++; + XtSetArg(args[j], XtNy, gameHistoryY); j++; + XtSetArg(args[j], XtNwidth, gameHistoryW); j++; + XtSetArg(args[j], XtNheight, gameHistoryH); j++; + XtSetValues(hist->sh, args, j); + } + XtRealizeWidget(hist->sh); + return hist->sh; } @@ -467,15 +442,9 @@ HistoryPopUp() XtPopup(hist->sh, XtGrabNone); - // [HGM] restore old position - j = 0; - XtSetArg(args[j], XtNx, gameHistoryX); j++; - XtSetArg(args[j], XtNy, gameHistoryY); j++; - XtSetValues(hist->sh, args, j); - j=0; XtSetArg(args[j], XtNleftBitmap, xMarkPixmap); j++; - XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Show Move History"), + XtSetValues(XtNameToWidget(menuBarWidget, "menuView.Show Move History"), args, j); hist->Up=True; } @@ -499,3 +468,8 @@ HistoryShowProc(w, event, prms, nprms) ToNrEvent(currentMove); } +Boolean +MoveHistoryIsUp() +{ + return hist && hist->Up; +}