X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xgamelist.c;h=793eeb570e350cd26d10dea886129608c07d8069;hb=b382d988c6f886f3a49483df9e3e36de0b6b0824;hp=3a04f3f83082be7a7efec1bd1853ff47bacdcd01;hpb=369d80a758a3b9f552874f26909d79864a902731;p=xboard.git diff --git a/xgamelist.c b/xgamelist.c index 3a04f3f..793eeb5 100644 --- a/xgamelist.c +++ b/xgamelist.c @@ -1,7 +1,7 @@ /* * xgamelist.c -- Game list window, part of X front end for XBoard * - * Copyright 1995,2009 Free Software Foundation, Inc. + * Copyright 1995, 2009, 2010, 2011 Free Software Foundation, Inc. * ------------------------------------------------------------------------ * * GNU XBoard is free software: you can redistribute it and/or modify @@ -104,8 +104,14 @@ static char filterString[MSG_SIZ]; static int listLength; char gameListTranslations[] = - "(2): LoadSelectedProc() \n \ - Return: LoadSelectedProc() \n"; + "(2): LoadSelectedProc(0) \n \ + Home: LoadSelectedProc(-2) \n \ + End: LoadSelectedProc(2) \n \ + Up: LoadSelectedProc(-1) \n \ + Down: LoadSelectedProc(1) \n \ + Left: LoadSelectedProc(-1) \n \ + Right: LoadSelectedProc(1) \n \ + Return: LoadSelectedProc(0) \n"; char filterTranslations[] = "Return: SetFilterProc() \n"; @@ -178,7 +184,7 @@ GameListCreate(name, callback, client_data) XtSetArg(args[j], XtNdefaultColumns, 1); j++; XtSetArg(args[j], XtNforceColumns, True); j++; XtSetArg(args[j], XtNverticalList, True); j++; - listwidg = + listwidg = XtCreateManagedWidget("list", listWidgetClass, viewport, args, j); XawListHighlight(listwidg, 0); XtAugmentTranslations(listwidg, @@ -245,7 +251,7 @@ GameListCreate(name, callback, client_data) XtSetArg(args[j], XtNbottom, XtChainBottom); j++; XtSetArg(args[j], XtNleft, XtChainLeft); j++; XtSetArg(args[j], XtNright, XtChainRight); j++; - XtSetArg(args[j], XtNwidth, 173); j++; + XtSetArg(args[j], XtNwidth, fw_width - 225 - squareSize); j++; XtSetArg(args[j], XtNstring, filterString); j++; XtSetArg(args[j], XtNdisplayCaret, False); j++; XtSetArg(args[j], XtNresizable, True); j++; @@ -320,6 +326,7 @@ GameListCreate(name, callback, client_data) XtRealizeWidget(shell); CatchDeleteWindow(shell, "GameListPopDown"); + XtSetKeyboardFocus(shell, listwidg); return shell; } @@ -350,14 +357,13 @@ GameListPrepare() static void GameListReplace() -{ // [HGM] filter: put in separate routine, to make callable from call-back - Arg args[16]; - int j; - Widget listwidg; +{ + // filter: put in separate routine, to make callable from call-back + Widget listwidg; - listwidg = XtNameToWidget(glc->shell, "*form.viewport.list"); - XawListChange(listwidg, glc->strings, 0, 0, True); - XawListHighlight(listwidg, 0); + listwidg = XtNameToWidget(glc->shell, "*form.viewport.list"); + XawListChange(listwidg, glc->strings, 0, 0, True); + XawListHighlight(listwidg, 0); } void @@ -408,7 +414,7 @@ GameListCallback(w, client_data, call_data) j = 0; XtSetArg(args[j], XtNstring, &name); j++; XtGetValues(filterText, args, j); - strcpy(filterString, name); + safeStrCpy(filterString, name, sizeof(filterString)/sizeof(filterString[0])); XawListHighlight(listwidg, 0); if(GameListPrepare()) GameListReplace(); // crashes on empty list... return; @@ -427,9 +433,7 @@ GameListPopUp(fp, filename) char *filename; { Arg args[16]; - int j, nstrings; - Widget listwidg; - ListGame *lg; + int j; char **st; if (glc == NULL) { @@ -454,7 +458,7 @@ GameListPopUp(fp, filename) if (glc->shell == NULL) { - glc->shell = GameListCreate(filename, GameListCallback, glc); + glc->shell = GameListCreate(filename, GameListCallback, glc); } else { GameListReplace(); // [HGM] filter: code put in separate routine j = 0; @@ -467,7 +471,7 @@ GameListPopUp(fp, filename) glc->up = True; j = 0; XtSetArg(args[j], XtNleftBitmap, xMarkPixmap); j++; - XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Show Game List"), + XtSetValues(XtNameToWidget(menuBarWidget, "menuView.Show Game List"), args, j); } @@ -510,7 +514,7 @@ ShowGameListProc(w, event, prms, nprms) glc->up = True; j = 0; XtSetArg(args[j], XtNleftBitmap, xMarkPixmap); j++; - XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Show Game List"), + XtSetValues(XtNameToWidget(menuBarWidget, "menuView.Show Game List"), args, j); } @@ -523,13 +527,21 @@ LoadSelectedProc(w, event, prms, nprms) { Widget listwidg; XawListReturnStruct *rs; - int index; + int index, direction = atoi(prms[0]); if (glc == NULL) return; listwidg = XtNameToWidget(glc->shell, "*form.viewport.list"); rs = XawListShowCurrent(listwidg); index = rs->list_index; if (index < 0) return; + if(direction != 0) { + index += direction; + if(direction == -2) index = 0; + if(direction == 2) index = listLength-1; + if(index < 0 || index >= listLength) return; + XawListHighlight(listwidg, index); + return; + } index = atoi(glc->strings[index])-1; // [HGM] filter: read true index from sequence nr of line if (cmailMsgLoaded) { CmailLoadGame(glc->fp, index + 1, glc->filename, True); @@ -551,7 +563,7 @@ SetFilterProc(w, event, prms, nprms) int j = 0; XtSetArg(args[j], XtNstring, &name); j++; XtGetValues(filterText, args, j); - strcpy(filterString, name); + safeStrCpy(filterString, name, sizeof(filterString)/sizeof(filterString[0])); if(GameListPrepare()) GameListReplace(); // crashes on empty list... list = XtNameToWidget(glc->shell, "*form.viewport.list"); XawListHighlight(list, 0); @@ -583,7 +595,7 @@ GameListPopDown() glc->up = False; j = 0; XtSetArg(args[j], XtNleftBitmap, None); j++; - XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Show Game List"), + XtSetValues(XtNameToWidget(menuBarWidget, "menuView.Show Game List"), args, j); } @@ -605,3 +617,210 @@ GameListIsUp() { return glc && glc->up; } + +//--------------------------------- Game-List options dialog ------------------------------------------ + +Widget gameListOptShell, listwidg; + +char *strings[20]; +int stringPtr; + +void GLT_ClearList() +{ + strings[0] = NULL; + stringPtr = 0; +} + +void GLT_AddToList(char *name) +{ + strings[stringPtr++] = name; + strings[stringPtr] = NULL; +} + +Boolean GLT_GetFromList(int index, char *name) +{ + safeStrCpy(name, strings[index], MSG_SIZ); + return TRUE; +} + +void GLT_DeSelectList() +{ + XawListChange(listwidg, strings, 0, 0, True); + XawListHighlight(listwidg, 0); +} + +void +GameListOptionsPopDown() +{ + if (gameListOptShell == NULL) return; + + XtPopdown(gameListOptShell); + XtDestroyWidget(gameListOptShell); + gameListOptShell = 0; + XtSetKeyboardFocus(shellWidget, formWidget); +} + +void +GameListOptionsCallback(w, client_data, call_data) + Widget w; + XtPointer client_data, call_data; +{ + String name; + Arg args[16]; + int j; + Widget listwidg; + XawListReturnStruct *rs; + int index; + char *p; + + j = 0; + XtSetArg(args[j], XtNlabel, &name); j++; + XtGetValues(w, args, j); + + if (strcmp(name, _("OK")) == 0) { + GLT_ParseList(); + appData.gameListTags = strdup(lpUserGLT); + GameListOptionsPopDown(); + return; + } else + if (strcmp(name, _("cancel")) == 0) { + GameListOptionsPopDown(); + return; + } + listwidg = XtNameToWidget(gameListOptShell, "*form.list"); + rs = XawListShowCurrent(listwidg); + index = rs->list_index; + if (index < 0) { + DisplayError(_("No tag selected"), 0); + return; + } + p = strings[index]; + if (strcmp(name, _("down")) == 0) { + if(index >= strlen(GLT_ALL_TAGS)) return; + strings[index] = strings[index+1]; + strings[++index] = p; + } else + if (strcmp(name, _("up")) == 0) { + if(index == 0) return; + strings[index] = strings[index-1]; + strings[--index] = p; + } else + if (strcmp(name, _("factory")) == 0) { + safeStrCpy(lpUserGLT, GLT_DEFAULT_TAGS, LPUSERGLT_SIZE); + GLT_TagsToList(lpUserGLT); + index = 0; + } + XawListHighlight(listwidg, index); +} + +Widget +GameListOptionsCreate() +{ + Arg args[16]; + Widget shell, form, viewport, layout; + Widget b_load, b_loadprev, b_loadnext, b_close, b_cancel; + Dimension fw_width; + XtPointer client_data = NULL; + int j; + + 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++; + shell = gameListOptShell = + XtCreatePopupShell("Game-list options", transientShellWidgetClass, + shellWidget, args, j); + 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], XtNdefaultColumns, 1); j++; + XtSetArg(args[j], XtNforceColumns, True); j++; + XtSetArg(args[j], XtNverticalList, True); j++; + listwidg = viewport = + XtCreateManagedWidget("list", listWidgetClass, form, args, j); + XawListHighlight(listwidg, 0); +// XtAugmentTranslations(listwidg, +// XtParseTranslationTable(gameListOptTranslations)); + + 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(_("factory"), commandWidgetClass, form, args, j); + XtAddCallback(b_load, XtNcallback, GameListOptionsCallback, 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(_("up"), commandWidgetClass, form, args, j); + XtAddCallback(b_loadprev, XtNcallback, GameListOptionsCallback, client_data); + + 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(_("down"), commandWidgetClass, form, args, j); + XtAddCallback(b_loadnext, XtNcallback, GameListOptionsCallback, client_data); + + 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_cancel = + XtCreateManagedWidget(_("cancel"), commandWidgetClass, form, args, j); + XtAddCallback(b_cancel, XtNcallback, GameListOptionsCallback, client_data); + + j = 0; + XtSetArg(args[j], XtNfromVert, viewport); j++; + XtSetArg(args[j], XtNfromHoriz, b_cancel); 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(_("OK"), commandWidgetClass, form, args, j); + XtAddCallback(b_close, XtNcallback, GameListOptionsCallback, client_data); + + safeStrCpy(lpUserGLT, appData.gameListTags, LPUSERGLT_SIZE); + GLT_TagsToList(lpUserGLT); + + XtRealizeWidget(shell); + CatchDeleteWindow(shell, "GameListOptionsPopDown"); + + return shell; +} + +void +GameListOptionsPopUp(Widget w, XEvent *event, String *prms, Cardinal *nprms) +{ + if (gameListOptShell == NULL) + gameListOptShell = GameListOptionsCreate(); + + XtPopup(gameListOptShell, XtGrabNone); +} + +