X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xgamelist.c;h=3015195c4780d7c36c7d7ff6fb551aac45bbf015;hb=dd5cb5a354036d69172eeec2dd5c0cbb49b5c2c8;hp=258eb39fc00e2fa3e1b331dcbcdb15c82e4f699d;hpb=2b546bdf3126bdacdeb9d40f34cfbbc1cb163db5;p=xboard.git diff --git a/xgamelist.c b/xgamelist.c index 258eb39..3015195 100644 --- a/xgamelist.c +++ b/xgamelist.c @@ -22,6 +22,7 @@ #include "config.h" +#include #include #include #include @@ -90,11 +91,13 @@ extern char *getenv(); # define N_(s) s #endif +extern GtkWidget *GUI_GameList; +extern GtkListStore *LIST_GameList; void SetFocus P((Widget w, XtPointer data, XEvent *event, Boolean *b)); extern Widget formWidget, shellWidget, boardWidget, menuBarWidget, gameListShell; -extern Display *xDisplay; + extern int squareSize; extern Pixmap xMarkPixmap; extern char *layoutName; @@ -104,8 +107,16 @@ 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"; typedef struct { Widget shell; @@ -129,195 +140,7 @@ GameListCreate(name, callback, client_data) 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); - XtAugmentTranslations(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(_("load"), 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(_("prev"), commandWidgetClass, form, args, j); - XtAddCallback(b_loadprev, XtNcallback, callback, 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(_("next"), commandWidgetClass, form, args, j); - XtAddCallback(b_loadnext, XtNcallback, callback, 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_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, 173); 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); - - 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"); - - return shell; + return; } static int @@ -422,66 +245,47 @@ GameListPopUp(fp, filename) FILE *fp; char *filename; { - Arg args[16]; - int j, nstrings; - Widget listwidg; - ListGame *lg; - char **st; - - if (glc == NULL) { - glc = (GameListClosure *) calloc(1, sizeof(GameListClosure)); - glc->x = glc->y = -1; - } - - if (glc->strings != NULL) { - st = glc->strings; - while (*st) { - free(*st++); - } - free(glc->strings); + GtkTreeIter iter; + int i=0,nstrings; + ListGame *lg; + + /* first clear everything, do we need this? */ + gtk_list_store_clear(LIST_GameList); + + /* fill list with information */ + lg = (ListGame *) gameList.head; + nstrings = ((ListGame *) gameList.tailPred)->number; + while (nstrings--) + { + gtk_list_store_append (LIST_GameList, &iter); + gtk_list_store_set (LIST_GameList, &iter, + 0, StrSave(filename), + 1, GameListLine(lg->number, &lg->gameInfo), + 2, fp, + -1); + lg = (ListGame *) lg->node.succ; } - GameListPrepare(); // [HGM] filter: code put in separate routine - - glc->fp = fp; + /* show widget */ + gtk_widget_show (GUI_GameList); - if (glc->filename != NULL) free(glc->filename); - glc->filename = StrSave(filename); +// XtPopup(glc->shell, XtGrabNone); +// glc->up = True; +// j = 0; +// XtSetArg(args[j], XtNleftBitmap, xMarkPixmap); j++; +// XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Show Game List"), +// args, j); - - if (glc->shell == NULL) { - glc->shell = GameListCreate(filename, GameListCallback, glc); - } else { - GameListReplace(); // [HGM] filter: code put in separate routine - j = 0; - XtSetArg(args[j], XtNiconName, (XtArgVal) filename); j++; - XtSetArg(args[j], XtNtitle, (XtArgVal) filename); j++; - XtSetValues(glc->shell, args, j); - } - - XtPopup(glc->shell, XtGrabNone); - glc->up = True; - j = 0; - XtSetArg(args[j], XtNleftBitmap, xMarkPixmap); j++; - XtSetValues(XtNameToWidget(menuBarWidget, "menuMode.Show Game List"), - args, j); + return; } 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; + GameListPopDown(); + + gtk_list_store_clear(LIST_GameList); + return; } void @@ -519,13 +323,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); @@ -535,29 +347,35 @@ LoadSelectedProc(w, event, prms, nprms) } void +SetFilterProc(w, event, prms, nprms) + 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); + strcpy(filterString, name); + if(GameListPrepare()) GameListReplace(); // crashes on empty list... + 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; + /* hides the history window */ - 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, "menuMode.Show Game List"), - args, j); + gtk_widget_hide (GUI_GameList); + return; } void @@ -576,5 +394,220 @@ GameListHighlight(index) Boolean GameListIsUp() { - return glc && glc->up; + /* return status of history window */ + + return gtk_widget_get_visible (GUI_GameList); +} + +//--------------------------------- 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) +{ + strcpy(name, strings[index]); +} + +void GLT_DeSelectList() +{ + XawListChange(listwidg, strings, 0, 0, True); + XawListHighlight(listwidg, 0); +} + +void +GameListOptionsPopDown() +{ + Arg args[16]; + int j; + + 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) { + strcpy(lpUserGLT, GLT_DEFAULT_TAGS); + 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); + + strcpy(lpUserGLT, appData.gameListTags); + GLT_TagsToList(lpUserGLT); + + XtRealizeWidget(shell); + // CatchDeleteWindow(shell, "GameListOptionsPopDown"); + + return shell; +} + +void +GameListOptionsPopUp(Widget w, XEvent *event, String *prms, Cardinal *nprms) +{ + Arg args[16]; + int j, nstrings; + Widget listwidg; + + if (gameListOptShell == NULL) { + gameListOptShell = GameListOptionsCreate(); + } + + XtPopup(gameListOptShell, XtGrabNone); } + +