X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xgamelist.c;h=50367b1f17dc8b0259354ffe8b851d9f61264691;hb=73419c47f539f4f6d0700fe8ec89bb0f6259c94e;hp=0f0b53e70e08d06bdfdf52c3c4b532551e2f5afb;hpb=412e5bff85b4e47d337cfb4923cc406325903df2;p=xboard.git diff --git a/xgamelist.c b/xgamelist.c index 0f0b53e..50367b1 100644 --- a/xgamelist.c +++ b/xgamelist.c @@ -76,29 +76,16 @@ extern char *getenv(); #endif #include "common.h" -#include "frontend.h" #include "backend.h" #include "xboard.h" #include "xgamelist.h" -#include "gettext.h" - -#ifdef ENABLE_NLS -# define _(s) gettext (s) -# define N_(s) gettext_noop (s) -#else -# define _(s) (s) -# define N_(s) s -#endif +#include "dialogs.h" -void SetFocus P((Widget w, XtPointer data, XEvent *event, Boolean *b)); - -static Widget filterText; -static char filterString[MSG_SIZ]; -static int listLength, wins, losses, draws, page; - char gameListTranslations[] = - ": LoadSelectedProc(100) Set() \n \ + ": WheelProc(-3) \n \ + : WheelProc(3) \n \ + : LoadSelectedProc(100) Set() \n \ (2): LoadSelectedProc(0) \n \ Home: LoadSelectedProc(-2) \n \ End: LoadSelectedProc(2) \n \ @@ -108,577 +95,24 @@ char gameListTranslations[] = Down: LoadSelectedProc(1) \n \ Left: LoadSelectedProc(-1) \n \ Right: LoadSelectedProc(1) \n \ + Prior: LoadSelectedProc(-4) \n \ + Next: LoadSelectedProc(4) \n \ Return: LoadSelectedProc(0) \n"; char filterTranslations[] = "Return: SetFilterProc() \n"; -char *dummyList[] = { N_("no games matched your request"), NULL }; - -typedef struct { - Widget shell; - Position x, y; - Dimension w, h; - Boolean up; - FILE *fp; - char *filename; - char **strings; -} GameListClosure; -static GameListClosure *glc = NULL; - -Widget -GameListCreate (char *name, XtCallbackProc callback, XtPointer client_data) -{ - Arg args[16]; - Widget shell, form, viewport, listwidg, layout, label; - Widget b_load, b_loadprev, b_loadnext, b_close, b_filter; - Dimension fw_width; - int j; - GameListClosure *glc = (GameListClosure *) client_data; - - j = 0; - XtSetArg(args[j], XtNwidth, &fw_width); j++; - XtGetValues(formWidget, args, j); - - j = 0; - XtSetArg(args[j], XtNresizable, True); j++; - XtSetArg(args[j], XtNallowShellResize, True); j++; -#if TOPLEVEL - shell = gameListShell = - XtCreatePopupShell(name, topLevelShellWidgetClass, - shellWidget, args, j); -#else - shell = gameListShell = - XtCreatePopupShell(name, transientShellWidgetClass, - shellWidget, args, j); -#endif - layout = - XtCreateManagedWidget(layoutName, formWidgetClass, shell, - layoutArgs, XtNumber(layoutArgs)); - j = 0; - XtSetArg(args[j], XtNborderWidth, 0); j++; - form = - XtCreateManagedWidget("form", formWidgetClass, layout, args, j); - - j = 0; - XtSetArg(args[j], XtNtop, XtChainTop); j++; - XtSetArg(args[j], XtNbottom, XtChainBottom); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNright, XtChainRight); j++; - XtSetArg(args[j], XtNresizable, False); j++; - XtSetArg(args[j], XtNwidth, fw_width); j++; - XtSetArg(args[j], XtNallowVert, True); j++; - viewport = - XtCreateManagedWidget("viewport", viewportWidgetClass, form, args, j); - - j = 0; -// XtSetArg(args[j], XtNlist, glc->strings); j++; - XtSetArg(args[j], XtNdefaultColumns, 1); j++; - XtSetArg(args[j], XtNforceColumns, True); j++; - XtSetArg(args[j], XtNverticalList, True); j++; - listwidg = - XtCreateManagedWidget("list", listWidgetClass, viewport, args, j); - XawListHighlight(listwidg, 0); - XtOverrideTranslations(listwidg, - XtParseTranslationTable(gameListTranslations)); - - j = 0; - XtSetArg(args[j], XtNfromVert, viewport); j++; - XtSetArg(args[j], XtNtop, XtChainBottom); j++; - XtSetArg(args[j], XtNbottom, XtChainBottom); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNright, XtChainLeft); j++; - b_load = - XtCreateManagedWidget(_("thresholds"), commandWidgetClass, form, args, j); - XtAddCallback(b_load, XtNcallback, callback, client_data); - - j = 0; - XtSetArg(args[j], XtNfromVert, viewport); j++; - XtSetArg(args[j], XtNfromHoriz, b_load); j++; - XtSetArg(args[j], XtNtop, XtChainBottom); j++; - XtSetArg(args[j], XtNbottom, XtChainBottom); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNright, XtChainLeft); j++; - b_loadprev = - XtCreateManagedWidget(_("find position"), commandWidgetClass, form, args, j); - XtAddCallback(b_loadprev, XtNcallback, callback, client_data); -#if 1 - j = 0; - XtSetArg(args[j], XtNfromVert, viewport); j++; - XtSetArg(args[j], XtNfromHoriz, b_loadprev); j++; - XtSetArg(args[j], XtNtop, XtChainBottom); j++; - XtSetArg(args[j], XtNbottom, XtChainBottom); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNright, XtChainLeft); j++; - b_loadnext = - XtCreateManagedWidget(_("next"), commandWidgetClass, form, args, j); - XtAddCallback(b_loadnext, XtNcallback, callback, client_data); -#else - b_loadnext = b_loadprev; -#endif - j = 0; - XtSetArg(args[j], XtNfromVert, viewport); j++; - XtSetArg(args[j], XtNfromHoriz, b_loadnext); j++; - XtSetArg(args[j], XtNtop, XtChainBottom); j++; - XtSetArg(args[j], XtNbottom, XtChainBottom); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNright, XtChainLeft); j++; - b_close = - XtCreateManagedWidget(_("close"), commandWidgetClass, form, args, j); - XtAddCallback(b_close, XtNcallback, callback, client_data); - - j = 0; - XtSetArg(args[j], XtNfromVert, viewport); j++; - XtSetArg(args[j], XtNfromHoriz, b_close); j++; - XtSetArg(args[j], XtNtop, XtChainBottom); j++; - XtSetArg(args[j], XtNbottom, XtChainBottom); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNright, XtChainLeft); j++; - XtSetArg(args[j], XtNborderWidth, 0); j++; - label = - XtCreateManagedWidget(_("Filter:"), labelWidgetClass, form, args, j); - - j = 0; - XtSetArg(args[j], XtNfromVert, viewport); j++; - XtSetArg(args[j], XtNfromHoriz, label); j++; - XtSetArg(args[j], XtNtop, XtChainBottom); j++; - XtSetArg(args[j], XtNbottom, XtChainBottom); j++; - XtSetArg(args[j], XtNleft, XtChainLeft); j++; - XtSetArg(args[j], XtNright, XtChainRight); j++; - XtSetArg(args[j], XtNwidth, fw_width - 275 - squareSize); j++; - XtSetArg(args[j], XtNstring, filterString); j++; - XtSetArg(args[j], XtNdisplayCaret, False); j++; - XtSetArg(args[j], XtNresizable, True); j++; -// XtSetArg(args[j], XtNwidth, bw_width); j++; /*force wider than buttons*/ - /* !!Work around an apparent bug in XFree86 4.0.1 (X11R6.4.3) */ - XtSetArg(args[j], XtNeditType, XawtextEdit); j++; - XtSetArg(args[j], XtNuseStringInPlace, False); j++; - filterText = - XtCreateManagedWidget(_("filtertext"), asciiTextWidgetClass, form, args, j); - XtAddEventHandler(filterText, ButtonPressMask, False, SetFocus, (XtPointer) shell); - XtOverrideTranslations(filterText, - XtParseTranslationTable(filterTranslations)); - - j = 0; - XtSetArg(args[j], XtNfromVert, viewport); j++; - XtSetArg(args[j], XtNfromHoriz, filterText); j++; - XtSetArg(args[j], XtNtop, XtChainBottom); j++; - XtSetArg(args[j], XtNbottom, XtChainBottom); j++; - XtSetArg(args[j], XtNleft, XtChainRight); j++; - XtSetArg(args[j], XtNright, XtChainRight); j++; - b_filter = - XtCreateManagedWidget(_("apply"), commandWidgetClass, form, args, j); - XtAddCallback(b_filter, XtNcallback, callback, client_data); - - - if(wpGameList.width > 0) { - glc->x = wpGameList.x; - glc->y = wpGameList.y; - glc->w = wpGameList.width; - glc->h = wpGameList.height; - } - - if (glc->x == -1) { - Position y1; - Dimension h1; - int xx, yy; - Window junk; - - j = 0; - XtSetArg(args[j], XtNheight, &h1); j++; - XtSetArg(args[j], XtNy, &y1); j++; - XtGetValues(boardWidget, args, j); - glc->w = fw_width * 3/4; - glc->h = squareSize * 3; - - XSync(xDisplay, False); -#ifdef NOTDEF - /* This code seems to tickle an X bug if it is executed too soon - after xboard starts up. The coordinates get transformed as if - the main window was positioned at (0, 0). - */ - XtTranslateCoords(shellWidget, (fw_width - glc->w) / 2, - y1 + (h1 - glc->h + appData.borderYoffset) / 2, - &glc->x, &glc->y); -#else /*!NOTDEF*/ - XTranslateCoordinates(xDisplay, XtWindow(shellWidget), - RootWindowOfScreen(XtScreen(shellWidget)), - (fw_width - glc->w) / 2, - y1 + (h1 - glc->h + appData.borderYoffset) / 2, - &xx, &yy, &junk); - glc->x = xx; - glc->y = yy; -#endif /*!NOTDEF*/ - if (glc->y < 0) glc->y = 0; /*avoid positioning top offscreen*/ - } - j = 0; - XtSetArg(args[j], XtNheight, glc->h); j++; - XtSetArg(args[j], XtNwidth, glc->w); j++; - XtSetArg(args[j], XtNx, glc->x - appData.borderXoffset); j++; - XtSetArg(args[j], XtNy, glc->y - appData.borderYoffset); j++; - XtSetValues(shell, args, j); - - XtRealizeWidget(shell); - CatchDeleteWindow(shell, "GameListPopDown"); - XtSetKeyboardFocus(shell, listwidg); - - return shell; -} - -extern int soughtCounts[]; -extern Board soughtBoard; - -static int -GameListPrepare (int byPos) -{ // [HGM] filter: put in separate routine, to make callable from call-back - int nstrings; - ListGame *lg; - char **st, *line; - TimeMark t, t2; - - GetTimeMark(&t); - if(st = glc->strings) while(*st) free(*st++); - nstrings = ((ListGame *) gameList.tailPred)->number; - glc->strings = (char **) malloc((nstrings + 1) * sizeof(char *)); - st = glc->strings; - lg = (ListGame *) gameList.head; - listLength = wins = losses = draws = 0; - if(byPos) InitSearch(); - while (nstrings--) { - int pos = -1; - line = GameListLine(lg->number, &lg->gameInfo); - if((filterString[0] == NULLCHAR || SearchPattern( line, filterString )) && (!byPos || (pos=GameContainsPosition(glc->fp, lg)) >= 0) ) { - *st++ = line; // [HGM] filter: make adding line conditional. - listLength++; - if( lg->gameInfo.result == WhiteWins ) wins++; else - if( lg->gameInfo.result == BlackWins ) losses++; else - if( lg->gameInfo.result == GameIsDrawn ) draws++; - } - if(lg->number % 2000 == 0) { - char buf[MSG_SIZ]; - snprintf(buf, MSG_SIZ, _("Scanning through games (%d)"), lg->number); - DisplayTitle(buf); - } - lg->position = pos; - lg = (ListGame *) lg->node.succ; - } -GetTimeMark(&t2);printf("GameListPrepare %ld msec\n", SubtractTimeMarks(&t2,&t)); - DisplayTitle("XBoard"); - *st = NULL; - return listLength; -} - -static char *list[1003]; -int listEnd; - -static void -GameListReplace (int page) -{ - // filter: put in separate routine, to make callable from call-back - Widget listwidg; - Arg arg; - char buf[MSG_SIZ], *p, **st=list; - int i; - - if(page) *st++ = _("previous page"); else if(listLength > 1000) *st++ = ""; - for(i=0; i<1000; i++) if( !(*st++ = glc->strings[page+i]) ) { st--; break; } - listEnd = st - list; - if(page + 1000 <= listLength) *st++ = _("next page"); - *st = NULL; - - listwidg = XtNameToWidget(glc->shell, "*form.viewport.list"); - XtSetArg(arg, XtNlist, listLength ? list : dummyList); // empty list displays message - XawListChange(listwidg, list, 0, 0, True); - XtSetValues(listwidg, &arg, 1); - XawListHighlight(listwidg, 0); - snprintf(buf, MSG_SIZ, _("%s - %d/%d games (%d-%d-%d)"), glc->filename, listLength, ((ListGame *) gameList.tailPred)->number, wins, losses, draws); - XtSetArg(arg, XtNtitle, buf); - XtSetValues(glc->shell, &arg, 1); -} - -void -GameListCallback (Widget w, XtPointer client_data, XtPointer call_data) -{ - String name; - Arg args[16]; - int j; - Widget listwidg; - GameListClosure *glc = (GameListClosure *) client_data; - XawListReturnStruct *rs; - int index; - - j = 0; - XtSetArg(args[j], XtNlabel, &name); j++; - XtGetValues(w, args, j); - - if (strcmp(name, _("close")) == 0) { - GameListPopDown(); - return; - } - if (strcmp(name, _("thresholds")) == 0) { - LoadOptionsProc(); - return; - } - listwidg = XtNameToWidget(glc->shell, "*form.viewport.list"); - rs = XawListShowCurrent(listwidg); - if (strcmp(name, _("load")) == 0) { - index = rs->list_index; - if (index < 0) { - DisplayError(_("No game selected"), 0); - return; - } - } else if (strcmp(name, _("next")) == 0) { - index = rs->list_index + 1; - if (index >= listLength || !list[index]) { - DisplayError(_("Can't go forward any further"), 0); - return; - } - XawListHighlight(listwidg, index); - } else if (strcmp(name, _("prev")) == 0) { - index = rs->list_index - 1; - if (index < 0) { - DisplayError(_("Can't back up any further"), 0); - return; - } - XawListHighlight(listwidg, index); - } else if (strcmp(name, _("apply")) == 0 || - strcmp(name, _("find position")) == 0) { - String text; - j = 0; - XtSetArg(args[j], XtNstring, &text); j++; - XtGetValues(filterText, args, j); - safeStrCpy(filterString, text, sizeof(filterString)/sizeof(filterString[0])); - XawListHighlight(listwidg, 0); - GameListPrepare(strcmp(name, _("find position")) == 0); GameListReplace(0); - return; - } -#if 1 - index = atoi(list[index])-1; // [HGM] filter: read true index from sequence nr of line - if (cmailMsgLoaded) { - CmailLoadGame(glc->fp, index + 1, glc->filename, True); - } else { - LoadGame(glc->fp, index + 1, glc->filename, True); - } -#else - printf("This code should have been unreachable. Please report bug!\n"); -#endif -} - -void -GameListPopUp (FILE *fp, char *filename) -{ - Arg args[16]; - int j; - char **st; - - if (glc == NULL) { - glc = (GameListClosure *) calloc(1, sizeof(GameListClosure)); - glc->x = glc->y = -1; - glc->filename = NULL; - glc->shell = NULL; - } - - GameListPrepare(False); // [HGM] filter: code put in separate routine - - glc->fp = fp; - - if (glc->filename != NULL) free(glc->filename); - glc->filename = StrSave(filename); - - if (glc->shell == NULL) { - glc->shell = GameListCreate(filename, GameListCallback, glc); - } else { - j = 0; - XtSetArg(args[j], XtNiconName, (XtArgVal) filename); j++; -// XtSetArg(args[j], XtNtitle, (XtArgVal) filename); j++; - XtSetValues(glc->shell, args, j); - } - page = 0; - GameListReplace(0); // [HGM] filter: code put in separate routine, and also called to set title - - XtPopup(glc->shell, XtGrabNone); - glc->up = True; - j = 0; - XtSetArg(args[j], XtNleftBitmap, xMarkPixmap); j++; - XtSetValues(XtNameToWidget(menuBarWidget, "menuView.Show Game List"), - args, j); -} - -void -GameListDestroy () -{ - if (glc == NULL) return; - GameListPopDown(); - if (glc->strings != NULL) { - char **st; - st = glc->strings; - while (*st) { - free(*st++); - } - free(glc->strings); - } - free(glc); - glc = NULL; -} - -void -ShowGameListProc () -{ - Arg args[16]; - int j; - - if (glc == NULL) { - DisplayError(_("There is no game list"), 0); - return; - } - if (glc->up) { - GameListPopDown(); - return; - } - XtPopup(glc->shell, XtGrabNone); - glc->up = True; - j = 0; - XtSetArg(args[j], XtNleftBitmap, xMarkPixmap); j++; - XtSetValues(XtNameToWidget(menuBarWidget, "menuView.Show Game List"), - args, j); - GameListHighlight(lastLoadGameNumber); -} void LoadSelectedProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { - Widget listwidg; - XawListReturnStruct *rs; - int index, direction = atoi(prms[0]); -printf("action(%d)\n",direction); - if (glc == NULL || listLength == 0) return; - listwidg = XtNameToWidget(glc->shell, "*form.viewport.list"); - if(direction == 100) { XtSetKeyboardFocus(glc->shell, listwidg); return; } - rs = XawListShowCurrent(listwidg); - index = rs->list_index; - if (index < 0) return; - if(page && index == 0) { - page -= 1000; - if(page < 0) page = 0; // safety - GameListReplace(page); - return; - } - if(index == 1001) { - page += 1000; - GameListReplace(page); - return; - } - - if(direction != 0) { - int doLoad = abs(direction) > 2; - if(doLoad) direction /= 3; - index += direction; - if(direction == -2) index = 0; - if(direction == 2) index = listEnd-1; - if(index < 0 || index >= listEnd) return; - XawListHighlight(listwidg, index); - if(!doLoad) return; - } - index = atoi(list[index])-1; // [HGM] filter: read true index from sequence nr of line - if (cmailMsgLoaded) { - CmailLoadGame(glc->fp, index + 1, glc->filename, True); - } else { - LoadGame(glc->fp, index + 1, glc->filename, True); - XSync(xDisplay, False); - XSetInputFocus(xDisplay, XtWindow(boardWidget), RevertToPointerRoot, CurrentTime); - } + if(GameListClicks(atoi(prms[0]))) return; // if no game loaded, no focus transfer + XSync(xDisplay, False); + XSetInputFocus(xDisplay, XtWindow(boardWidget), RevertToPointerRoot, CurrentTime); } void SetFilterProc (Widget w, XEvent *event, String *prms, Cardinal *nprms) { - Arg args[16]; - String name; - Widget list; - int j = 0; - XtSetArg(args[j], XtNstring, &name); j++; - XtGetValues(filterText, args, j); - safeStrCpy(filterString, name, sizeof(filterString)/sizeof(filterString[0])); - GameListPrepare(False); GameListReplace(0); - list = XtNameToWidget(glc->shell, "*form.viewport.list"); - XawListHighlight(list, 0); - j = 0; - XtSetArg(args[j], XtNdisplayCaret, False); j++; - XtSetValues(filterText, args, j); - XtSetKeyboardFocus(glc->shell, list); -} - -void -GameListPopDown () -{ - Arg args[16]; - int j; - - if (glc == NULL) return; - j = 0; - XtSetArg(args[j], XtNx, &glc->x); j++; - XtSetArg(args[j], XtNy, &glc->y); j++; - XtSetArg(args[j], XtNheight, &glc->h); j++; - XtSetArg(args[j], XtNwidth, &glc->w); j++; - XtGetValues(glc->shell, args, j); - wpGameList.x = glc->x - 4; - wpGameList.y = glc->y - 23; - wpGameList.width = glc->w; - wpGameList.height = glc->h; - XtPopdown(glc->shell); - XtSetKeyboardFocus(shellWidget, formWidget); - glc->up = False; - j = 0; - XtSetArg(args[j], XtNleftBitmap, None); j++; - XtSetValues(XtNameToWidget(menuBarWidget, "menuView.Show Game List"), - args, j); -} - -void -GameListHighlight (int index) -{ - Widget listwidg; - int i=0; char **st; - if (glc == NULL || !glc->up) return; - listwidg = XtNameToWidget(glc->shell, "*form.viewport.list"); - st = list; - while(*st && atoi(*st)up; -} - -int -SaveGameListAsText (FILE *f) -{ - ListGame * lg = (ListGame *) gameList.head; - int nItem; - - if( !glc || ((ListGame *) gameList.tailPred)->number <= 0 ) { - DisplayError(_("Game list not loaded or empty"), 0); - return False; - } - - /* Copy the list into the global memory block */ - if( f != NULL ) { - - lg = (ListGame *) gameList.head; - - for (nItem = 0; nItem < ((ListGame *) gameList.tailPred)->number; nItem++){ - char * st = GameListLineFull(lg->number, &lg->gameInfo); - char *line = GameListLine(lg->number, &lg->gameInfo); - if(filterString[0] == NULLCHAR || SearchPattern( line, filterString ) ) - fprintf( f, "%s\n", st ); - free(st); free(line); - lg = (ListGame *) lg->node.succ; - } - - fclose(f); - return True; - } - return False; + SetFilter(); }