Use FICS atomic draw claim for sending move in zippy mode
[xboard.git] / xgamelist.c
index f92a473..35194ac 100644 (file)
@@ -104,8 +104,16 @@ static char filterString[MSG_SIZ];
 static int listLength;
 
 char gameListTranslations[] =
-  "<Btn1Up>(2): LoadSelectedProc() \n \
-   <Key>Return: LoadSelectedProc() \n";
+  "<Btn1Up>(2): LoadSelectedProc(0) \n \
+   <Key>Home: LoadSelectedProc(-2) \n \
+   <Key>End: LoadSelectedProc(2) \n \
+   <Key>Up: LoadSelectedProc(-1) \n \
+   <Key>Down: LoadSelectedProc(1) \n \
+   <Key>Left: LoadSelectedProc(-1) \n \
+   <Key>Right: LoadSelectedProc(1) \n \
+   <Key>Return: LoadSelectedProc(0) \n";
+char filterTranslations[] =
+  "<Key>Return: SetFilterProc() \n";
 
 typedef struct {
     Widget shell;
@@ -123,62 +131,6 @@ static Arg layoutArgs[] = {
     { XtNdefaultDistance, 0 }
 };
 
-/* [AS] Wildcard pattern matching */\r
-static Boolean HasPattern( const char * text, const char * pattern )\r
-{\r
-    while( *pattern != '\0' ) {\r
-        if( *pattern == '*' ) {\r
-            while( *pattern == '*' ) {\r
-                pattern++;\r
-            }\r
-\r
-            if( *pattern == '\0' ) {\r
-                return TRUE;\r
-            }\r
-\r
-            while( *text != '\0' ) {\r
-                if( HasPattern( text, pattern ) ) {\r
-                    return TRUE;\r
-                }\r
-                text++;\r
-            }\r
-        }\r
-        else if( (*pattern == *text) || ((*pattern == '?') && (*text != '\0')) ) {\r
-            pattern++;\r
-            text++;\r
-            continue;\r
-        }\r
-\r
-        return FALSE;\r
-    }\r
-\r
-    return TRUE;\r
-}\r
-\r
-static Boolean SearchPattern( const char * text, const char * pattern )\r
-{\r
-    Boolean result = TRUE;\r
-\r
-    if( pattern != NULL && *pattern != '\0' ) {\r
-        if( *pattern == '*' ) {\r
-            result = HasPattern( text, pattern );\r
-        }\r
-        else {\r
-            result = FALSE;\r
-\r
-            while( *text != '\0' ) {\r
-                if( HasPattern( text, pattern ) ) {\r
-                    result = TRUE;\r
-                    break;\r
-                }\r
-                text++;\r
-            }\r
-        }\r
-    }\r
-\r
-    return result;\r
-}\r
-\r
 Widget
 GameListCreate(name, callback, client_data)
      char *name;
@@ -310,6 +262,8 @@ GameListCreate(name, callback, client_data)
     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++;
@@ -372,6 +326,7 @@ GameListCreate(name, callback, client_data)
 
     XtRealizeWidget(shell);
     CatchDeleteWindow(shell, "GameListPopDown");
+    XtSetKeyboardFocus(shell, listwidg);
 
     return shell;
 }
@@ -575,13 +530,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);
@@ -591,6 +554,29 @@ 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];