Put front-end support for -recentEngines in XBoard
[xboard.git] / xboard.c
index 270295d..e4aec19 100644 (file)
--- a/xboard.c
+++ b/xboard.c
@@ -2175,10 +2175,13 @@ XBoard square size (hint): %d\n\
       /* For the coordFont, use the 0th font of the fontset. */
       XFontSet coordFontSet = CreateFontSet(appData.coordFont);
       XFontStruct **font_struct_list;
+      XFontSetExtents *fontSize;
       char **font_name_list;
       XFontsOfFontSet(coordFontSet, &font_struct_list, &font_name_list);
       coordFontID = XLoadFont(xDisplay, font_name_list[0]);
       coordFontStruct = XQueryFont(xDisplay, coordFontID);
+      fontSize = XExtentsOfFontSet(fontSet); // [HGM] figure out how much vertical space font takes
+      textHeight = fontSize->max_logical_extent.height + 5; // add borderWidth
     }
 #else
     appData.font = FindFont(appData.font, fontPxlSize);
@@ -2460,8 +2463,8 @@ XBoard square size (hint): %d\n\
       fprintf(stderr, _("%s: messageWidget geometry error %d %d %d %d %d\n"),
              programName, gres, w, h, wr, hr);
     }
-    textHeight = hr; // [HGM] save height for use in generic popup
     /* !! end hack */
+    if(!textHeight) textHeight = hr; // [HGM] if !NLS textHeight is still undefined, and we grab it from here
     XtSetArg(args[0], XtNleft,  XtChainLeft);  // [HGM] glue ends for good run-time sizing
     XtSetArg(args[1], XtNright, XtChainRight);
     XtSetValues(messageWidget, args, 2);
@@ -3888,6 +3891,39 @@ MenuBarSelect (Widget w, caddr_t addr, caddr_t index)
     (proc)(NULL, NULL, NULL, NULL);
 }
 
+static void
+MenuEngineSelect (Widget w, caddr_t addr, caddr_t index)
+{
+    RecentEngineEvent((int) addr);
+}
+
+void
+AppendEnginesToMenu (Widget menu, char *list)
+{
+    int i=0, j;
+    Widget entry;
+    MenuItem *mi;
+    Arg args[16];
+    char *p;
+
+    if(appData.recentEngines <= 0) return;
+    recentEngines = strdup(list);
+    j = 0;
+    XtSetArg(args[j], XtNleftMargin, 20);   j++;
+    XtSetArg(args[j], XtNrightMargin, 20);  j++;
+    while (*list) {
+       p = strchr(list, '\n'); if(p == NULL) break;
+       if(i == 0) XtCreateManagedWidget(_("----"), smeLineObjectClass, menu, args, j); // at least one valid item to add
+       *p = 0;
+       XtSetArg(args[j], XtNlabel, XtNewString(list));
+       entry = XtCreateManagedWidget("engine", smeBSBObjectClass, menu, args, j+1);
+       XtAddCallback(entry, XtNcallback,
+                         (XtCallbackProc) MenuEngineSelect,
+                         (caddr_t) i);
+       i++; *p = '\n'; list = p + 1;
+    }
+}
+
 void
 CreateMenuBarPopup (Widget parent, String name, Menu *mb)
 {
@@ -3916,6 +3952,7 @@ CreateMenuBarPopup (Widget parent, String name, Menu *mb)
        }
        mi++;
     }
+    if(!strcmp(mb->name, "Engine")) AppendEnginesToMenu(menu, appData.recentEngineList);
 }
 
 Widget