Add NO_GETTEXT flag for combobox. Fix bug #34991
[xboard.git] / xoptions.c
index 36cf573..71d9df5 100644 (file)
@@ -163,7 +163,7 @@ void SpinCallback(w, client_data, call_data)
 
     GetWidgetText(&currentOption[data], &val);
     sscanf(val, "%d", &j);
-    if (strcmp(name, "browse") == 0) {
+    if (strcmp(name, _("browse")) == 0) {
        char *q=val, *r;
        for(r = ""; *q; q++) if(*q == '.') r = q; else if(*q == '/') r = ""; // last dot after last slash
        if(!strcmp(r, "") && !currentCps && currentOption[data].type == FileName && currentOption[data].textValue)
@@ -200,36 +200,45 @@ void ComboSelect(w, addr, index) // callback for all combo items
     int j = 255 & (intptr_t) addr;
 
     values[i] = j; // store in temporary, for transfer at OK
-    XtSetArg(args[0], XtNlabel, _(((char**)currentOption[i].textValue)[j]));
+
+    if(currentOption[i].min & NO_GETTEXT)
+      XtSetArg(args[0], XtNlabel, ((char**)currentOption[i].textValue)[j]);
+    else
+      XtSetArg(args[0], XtNlabel, _(((char**)currentOption[i].textValue)[j]));
+
     XtSetValues(currentOption[i].handle, args, 1);
 
-    if(currentOption[i].min & 1 && !currentCps && comboCallback) (comboCallback)(i);
+    if(currentOption[i].min & COMBO_CALLBACK && !currentCps && comboCallback) (comboCallback)(i);
 }
 
-void CreateComboPopup(parent, name, n, mb)
+void CreateComboPopup(parent, option, n)
      Widget parent;
-     String name;
+     Option *option;
      int n;
-     char *mb[];
 {
     int i=0, j;
     Widget menu, entry;
     Arg args[16];
 
-    menu = XtCreatePopupShell(name, simpleMenuWidgetClass,
+    menu = XtCreatePopupShell(option->name, simpleMenuWidgetClass,
                              parent, NULL, 0);
     j = 0;
     XtSetArg(args[j], XtNwidth, 100);  j++;
 //    XtSetArg(args[j], XtNright, XtChainRight);  j++;
-    while (mb[i] != NULL) {
-           XtSetArg(args[j], XtNlabel, _(mb[i]));
-           entry = XtCreateManagedWidget(mb[i], smeBSBObjectClass,
-                                         menu, args, j+1);
-           XtAddCallback(entry, XtNcallback,
-                         (XtCallbackProc) ComboSelect,
-                         (caddr_t)(intptr_t) (256*n+i));
+    char **mb = (char **) option->textValue;
+    while (mb[i] != NULL) 
+      {
+       if (option->min & NO_GETTEXT)
+         XtSetArg(args[j], XtNlabel, mb[i]);
+       else
+         XtSetArg(args[j], XtNlabel, _(mb[i]));
+       entry = XtCreateManagedWidget((String) mb[i], smeBSBObjectClass,
+                                     menu, args, j+1);
+       XtAddCallback(entry, XtNcallback,
+                     (XtCallbackProc) ComboSelect,
+                     (caddr_t)(intptr_t) (256*n+i));
        i++;
-    }
+      }
 }
 
 
@@ -353,7 +362,8 @@ Option matchOptions[] = {
 { 0,  0,          0, NULL, (void*) &appData.roundSync, "", NULL, CheckBox, N_("Sync after round    (for concurrent playing of a single") },
 { 0,  0,          0, NULL, (void*) &appData.cycleSync, "", NULL, CheckBox, N_("Sync after cycle      tourney with multiple XBoards)") },
 { 0xD, 150,       0, NULL, (void*) &engineName, "", NULL, TextBox, N_("Tourney participants:") },
-{ 0,  1,          0, NULL, (void*) &engineChoice, (char*) (engineMnemonic+1), (engineMnemonic+1), ComboBox, N_("Select Engine:") },
+{ 0,  COMBO_CALLBACK | NO_GETTEXT,
+                 0, NULL, (void*) &engineChoice, (char*) (engineMnemonic+1), (engineMnemonic+1), ComboBox, N_("Select Engine:") },
 { 0,  0,         10, NULL, (void*) &appData.tourneyType, "", NULL, Spin, N_("Tourney type (0 = round-robin, 1 = gauntlet):") },
 { 0,  1, 1000000000, NULL, (void*) &appData.tourneyCycles, "", NULL, Spin, N_("Number of tourney cycles (or Swiss rounds):") },
 { 0,  1, 1000000000, NULL, (void*) &appData.defaultMatchGames, "", NULL, Spin, N_("Default Number of Games in Match (or Pairing):") },
@@ -1034,12 +1044,14 @@ GenericPopUp(Option *option, char *title, int dlgNr)
            XtSetArg(args[j], XtNleft, XtChainRight); j++;
            XtSetArg(args[j], XtNright, XtChainRight); j++;
            if(option[i].type == FileName || option[i].type == PathName) {
-               w = 50; msg = _("browse");
+               msg = _("browse");
+               /* automatically scale to width of text */
+               XtSetArg(args[j], XtNwidth, (XtArgVal) NULL );  j++;
            } else {
-               XtSetArg(args[j], XtNheight, 10);  j++;
                w = 20; msg = "+";
+               XtSetArg(args[j], XtNheight, 10);  j++;
+               XtSetArg(args[j], XtNwidth,   w);  j++;
            }
-           XtSetArg(args[j], XtNwidth, w);  j++;
            edit = XtCreateManagedWidget(msg, commandWidgetClass, form, args, j);
            XtAddCallback(edit, XtNcallback, SpinCallback, (XtPointer)(intptr_t) i);
 
@@ -1130,7 +1142,7 @@ GenericPopUp(Option *option, char *title, int dlgNr)
            XtSetArg(args[j], XtNlabel, _(((char**)option[i].textValue)[option[i].value]));  j++;
            option[i].handle = (void*)
                (last = XtCreateManagedWidget(" ", menuButtonWidgetClass, form, args, j));
-           CreateComboPopup(last, option[i].name, i, (char **) option[i].textValue);
+           CreateComboPopup(last, option + i, i);
            values[i] = option[i].value;
            break;
          case Break:
@@ -1573,12 +1585,18 @@ void MoveTypeInProc(Widget widget, caddr_t unused, XEvent *event)
 {
     char buf[10], keys[32];
     KeySym sym;
-    KeyCode metaL, metaR;
+    KeyCode metaL, metaR, ctrlL, ctrlR;
     int n = XLookupString(&(event->xkey), buf, 10, &sym, NULL);
     XQueryKeymap(xDisplay,keys);
     metaL = XKeysymToKeycode(xDisplay, XK_Meta_L);
     metaR = XKeysymToKeycode(xDisplay, XK_Meta_R);
-    if ( n == 1 && *buf >= 32 && !(keys[metaL>>3]&1<<(metaL&7)) && !(keys[metaR>>3]&1<<(metaR&7))) { // printable, no alt
+    ctrlL = XKeysymToKeycode(xDisplay, XK_Control_L);
+    ctrlR = XKeysymToKeycode(xDisplay, XK_Control_R);
+    if ( n == 1 && *buf >= 32 // printable
+        && !(keys[metaL>>3]&1<<(metaL&7)) && !(keys[metaR>>3]&1<<(metaR&7)) // no alt key pressed
+        && !(keys[ctrlL>>3]&1<<(ctrlL&7)) && !(keys[ctrlR>>3]&1<<(ctrlR&7)) // no ctrl key pressed
+       )
+      {
        if(appData.icsActive) { // text typed to board in ICS mode: divert to ICS input box
            if(shells[4]) { // box already exists: append to current contents
                char *p, newText[MSG_SIZ];
@@ -1626,7 +1644,7 @@ int InstallOK(int n)
 }
 
 Option installOptions[] = {
-{   0,  0,    0, NULL, (void*) &engineLine, (char*) engineMnemonic, engineList, ComboBox, N_("Select engine from list:") },
+{   0,  NO_GETTEXT, 0, NULL, (void*) &engineLine, (char*) engineMnemonic, engineList, ComboBox, N_("Select engine from list:") },
 {   0,  0,    0, NULL, NULL, NULL, NULL, Label, N_("or specify one below:") },
 {   0,  0,    0, NULL, (void*) &nickName, NULL, NULL, TextBox, N_("Nickname (optional):") },
 {   0,  0,    0, NULL, (void*) &useNick, NULL, NULL, CheckBox, N_("Use nickname in PGN player tags of engine-engine games") },