Translation: fixed some inconsistencies reported by Benno Schulenberg
[xboard.git] / xaw / xboard.c
index a834adf..4b4d864 100644 (file)
@@ -5,7 +5,7 @@
  * Massachusetts.
  *
  * Enhancements Copyright 1992-2001, 2002, 2003, 2004, 2005, 2006,
- * 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+ * 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
  *
  * The following terms apply to Digital Equipment Corporation's copyright
  * interest in XBoard:
@@ -202,7 +202,6 @@ extern char *getenv();
 #include "childio.h"
 #include "xgamelist.h"
 #include "xhistory.h"
-#include "xevalgraph.h"
 #include "menus.h"
 #include "board.h"
 #include "dialogs.h"
@@ -261,7 +260,6 @@ void TempForwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms))
 Boolean TempBackwardActive = False;
 void ManInner P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void DisplayMove P((int moveNumber));
-void ICSInitScript P((void));
 void update_ics_width P(());
 int CopyMemoProc P(());
 
@@ -319,6 +317,7 @@ WindowPlacement wpEvalGraph;
 WindowPlacement wpEngineOutput;
 WindowPlacement wpGameList;
 WindowPlacement wpTags;
+WindowPlacement wpDualBoard;
 
 
 /* This magic number is the number of intermediate frames used
@@ -388,60 +387,17 @@ XtActionsRec boardActions[] = {
 };
 
 char globalTranslations[] =
-  ":<Key>F9: MenuItem(Actions.Resign) \n \
-   :Ctrl<Key>n: MenuItem(File.NewGame) \n \
-   :Meta<Key>V: MenuItem(File.NewVariant) \n \
-   :Ctrl<Key>o: MenuItem(File.LoadGame) \n \
-   :Meta<Key>Next: MenuItem(LoadNextGameProc) \n \
+  ":Meta<Key>Next: MenuItem(LoadNextGameProc) \n \
    :Meta<Key>Prior: MenuItem(LoadPrevGameProc) \n \
    :Ctrl<Key>Down: LoadSelectedProc(3) \n \
    :Ctrl<Key>Up: LoadSelectedProc(-3) \n \
-   :Ctrl<Key>s: MenuItem(File.SaveGame) \n \
-   :Ctrl<Key>c: MenuItem(Edit.CopyGame) \n \
-   :Ctrl<Key>v: MenuItem(Edit.PasteGame) \n \
-   :Ctrl<Key>O: MenuItem(File.LoadPosition) \n \
    :Shift<Key>Next: MenuItem(LoadNextPositionProc) \n \
    :Shift<Key>Prior: MenuItem(LoadPrevPositionProc) \n \
-   :Ctrl<Key>S: MenuItem(File.SavePosition) \n \
-   :Ctrl<Key>C: MenuItem(Edit.CopyPosition) \n \
-   :Ctrl<Key>V: MenuItem(Edit.PastePosition) \n \
-   :Ctrl<Key>q: MenuItem(File.Quit) \n \
-   :Ctrl<Key>w: MenuItem(Mode.MachineWhite) \n \
-   :Ctrl<Key>b: MenuItem(Mode.MachineBlack) \n \
-   :Ctrl<Key>t: MenuItem(Mode.TwoMachines) \n \
-   :Ctrl<Key>a: MenuItem(Mode.AnalysisMode) \n \
-   :Ctrl<Key>g: MenuItem(Mode.AnalyzeFile) \n \
-   :Ctrl<Key>e: MenuItem(Mode.EditGame) \n \
-   :Ctrl<Key>E: MenuItem(Mode.EditPosition) \n \
-   :Meta<Key>O: MenuItem(View.EngineOutput) \n \
-   :Meta<Key>E: MenuItem(View.EvaluationGraph) \n \
-   :Meta<Key>G: MenuItem(View.GameList) \n \
-   :Meta<Key>H: MenuItem(View.MoveHistory) \n \
    :<Key>Pause: MenuItem(Mode.Pause) \n \
-   :<Key>F3: MenuItem(Action.Accept) \n \
-   :<Key>F4: MenuItem(Action.Decline) \n \
-   :<Key>F12: MenuItem(Action.Rematch) \n \
-   :<Key>F5: MenuItem(Action.CallFlag) \n \
-   :<Key>F6: MenuItem(Action.Draw) \n \
-   :<Key>F7: MenuItem(Action.Adjourn) \n \
-   :<Key>F8: MenuItem(Action.Abort) \n \
-   :<Key>F10: MenuItem(Action.StopObserving) \n \
-   :<Key>F11: MenuItem(Action.StopExamining) \n \
    :Ctrl<Key>d: MenuItem(DebugProc) \n \
    :Meta Ctrl<Key>F12: MenuItem(DebugProc) \n \
-   :Meta<Key>End: MenuItem(Edit.ForwardtoEnd) \n \
-   :Meta<Key>Right: MenuItem(Edit.Forward) \n \
-   :Meta<Key>Home: MenuItem(Edit.BacktoStart) \n \
-   :Meta<Key>Left: MenuItem(Edit.Backward) \n \
    :<Key>Left: MenuItem(Edit.Backward) \n \
    :<Key>Right: MenuItem(Edit.Forward) \n \
-   :<Key>Home: MenuItem(Edit.Revert) \n \
-   :<Key>End: MenuItem(Edit.TruncateGame) \n \
-   :Ctrl<Key>m: MenuItem(Engine.MoveNow) \n \
-   :Ctrl<Key>x: MenuItem(Engine.RetractMove) \n \
-   :Meta<Key>J: MenuItem(Options.Adjudications) \n \
-   :Meta<Key>U: MenuItem(Options.CommonEngine) \n \
-   :Meta<Key>T: MenuItem(Options.TimeControl) \n \
    :Ctrl<Key>P: MenuItem(PonderNextMove) \n "
 #ifndef OPTIONSDIALOG
     "\
@@ -452,8 +408,6 @@ char globalTranslations[] =
    :Ctrl<Key>H: MenuItem(HideThinkingProc) \n "
 #endif
    "\
-   :<Key>F1: MenuItem(Help.ManXBoard) \n \
-   :<Key>F2: MenuItem(View.FlipView) \n \
    :<KeyDown>Return: TempBackwardProc() \n \
    :<KeyUp>Return: TempForwardProc() \n";
 
@@ -464,7 +418,7 @@ char ICSInputTranslations[] =
 
 // [HGM] vari: another hideous kludge: call extend-end first so we can be sure select-start works,
 //             as the widget is destroyed before the up-click can call extend-end
-char commentTranslations[] = "<Btn3Down>: extend-end() select-start() CommentClick() \n";
+char commentTranslations[] = "<Btn3Down>: extend-end(PRIMARY) select-start() CommentClick() \n";
 
 String xboardResources[] = {
     "*Error*translations: #override\\n <Key>Return: ErrorPopDown()",
@@ -541,7 +495,7 @@ xpm_print_avail (FILE *fp, char *ext)
 {
     int i;
 
-    fprintf(fp, _("Available `%s' sizes:\n"), ext);
+    fprintf(fp, _("Available '%s' sizes:\n"), ext);
     for (i=1; i<MAXSQSIZE; ++i) {
        if (xpm_avail[i])
          printf("%d\n", i);
@@ -574,7 +528,7 @@ xpm_closest_to (char *dirname, int size, char *ext)
     }
 
     if (!sm_index) {
-       fprintf(stderr, _("Error: No `%s' files!\n"), ext);
+       fprintf(stderr, _("Error: No '%s' files!\n"), ext);
        exit(1);
     }
 
@@ -980,6 +934,7 @@ PrintArg (ArgType t)
     case ArgString:   p = " STR"; break;
     case ArgBoolean:  p = " TF"; break;
     case ArgSettingsFilename:
+    case ArgBackupSettingsFile:
     case ArgFilename: p = " FILE"; break;
     case ArgX:        p = " Nx"; break;
     case ArgY:        p = " Ny"; break;
@@ -998,6 +953,109 @@ PrintArg (ArgType t)
   return p;
 }
 
+char *
+GenerateGlobalTranslationTable (void)
+{
+  /* go through all menu items and extract the keyboard shortcuts, so that X11 can load them */
+  char *output;
+
+  int i,j;
+  MenuItem *mi;
+
+  output = strdup("");
+
+  /* loop over all menu entries */
+  for( i=0; menuBar[i].mi ; i++)
+    {
+      mi = menuBar[i].mi;
+      for(j=0; mi[j].proc; j++)
+       {
+         if (mi[j].accel)
+           {
+             int ctrl  = 0;
+             int shift = 0;
+             int alt   = 0;
+
+             char *key,*test, *mods;
+
+             /* check for Ctrl/Alt */
+             if( strstr(mi[j].accel, "<Ctrl>")  ) ctrl  = 1;
+             if( strstr(mi[j].accel, "<Shift>") ) shift = 1;
+             if( strstr(mi[j].accel, "<Alt>")   ) alt   = 1;
+
+             /* remove all <...> */
+             test = strrchr(mi[j].accel, '>');
+             if ( test==NULL )
+               key = strdup(mi[j].accel);
+             else
+               key = strdup(++test); // remove ">"
+
+             /* instead of shift X11 uses the uppercase letter directly*/
+             if (shift && strlen(key)==1 )
+               {
+                 *key  = toupper(*key);
+                 shift = 0;
+               }
+
+             /* handle some special cases which have different names in X11 */
+             if ( strncmp(key, "Page_Down", 9) == 0 )
+               {
+                 free(key);
+                 key=strdup("Next");
+               }
+             else if ( strncmp(key, "Page_Up", 7) == 0 )
+               {
+                 free(key);
+                 key=strdup("Prior");
+               };
+
+             /* create string of mods */
+             if (ctrl)
+               mods = strdup("Ctrl ");
+             else
+               mods = strdup("");
+
+             if(alt)
+               {
+                 mods = realloc(mods, strlen(mods) + strlen("Meta ")+1);
+                 strncat(mods, "Meta ", 5);
+               };
+
+             if(shift)
+               {
+                 mods = realloc(mods, strlen(mods) + strlen("Shift ")+1);
+                 strncat(mods, "Shift ", 6);
+               };
+
+             // remove trailing space
+             if( isspace(mods[strlen(mods)-1]) )
+               mods[strlen(mods)-1]='\0';
+
+             /* get the name for the callback, we can use MenuItem() here that will call KeyBindingProc */
+             size_t namesize = snprintf(NULL, 0, "%s.%s", menuBar[i].ref, mi[j].ref);
+             char *name = malloc(namesize+1);
+             snprintf(name, namesize+1, "%s.%s", menuBar[i].ref, mi[j].ref);
+
+             size_t buffersize = snprintf(NULL, 0, ":%s<Key>%s: MenuItem(%s) \n ", mods, key, name);
+             char *buffer = malloc(buffersize+1);
+             snprintf(buffer, buffersize+1, ":%s<Key>%s: MenuItem(%s) \n ", mods, key, name);
+
+             /* add string to the output */
+             output = realloc(output, strlen(output) + strlen(buffer)+1);
+             strncat(output, buffer, strlen(buffer));
+
+             /* clean up */
+             free(key);
+             free(buffer);
+             free(name);
+             free(mods);
+           }
+       }
+    }
+  return output;
+}
+
+
 void
 PrintOptions ()
 {
@@ -1027,6 +1085,11 @@ PrintOptions ()
   if(len) buf[len] = NULLCHAR, printf("%s\n", buf);
 }
 
+void
+SlaveResize (Option *opt)
+{
+}
+
 int
 main (int argc, char **argv)
 {
@@ -1266,7 +1329,6 @@ main (int argc, char **argv)
       XtSetArg(args[1], XtNforeground, &buttonForegroundPixel);
       XtGetValues(optList[W_PAUSE].handle, args, 2);
     }
-    AppendEnginesToMenu(appData.recentEngineList);
 
     xBoardWindow = XtWindow(boardWidget);
 
@@ -1326,8 +1388,13 @@ main (int argc, char **argv)
     if (appData.animate || appData.animateDragging)
       CreateAnimVars();
 
+
+    char *TranslationsTableMenus=GenerateGlobalTranslationTable ();
+
     XtAugmentTranslations(formWidget,
                          XtParseTranslationTable(globalTranslations));
+    XtAugmentTranslations(formWidget,
+                         XtParseTranslationTable(TranslationsTableMenus));
 
     XtAddEventHandler(formWidget, KeyPressMask, False,
                      (XtEventHandler) MoveTypeInProc, NULL);
@@ -1562,7 +1629,7 @@ FindFont (char *pattern, int targetPxlSize)
         safeStrCpy(p, best, strlen(best)+1 );
     }
     if (appData.debugMode) {
-        fprintf(debugFP, _("resolved %s at pixel size %d\n  to %s\n"),
+        fprintf(debugFP, "resolved %s at pixel size %d\n  to %s\n",
                pattern, targetPxlSize, p);
     }
     XFreeFontNames(fonts);
@@ -1624,18 +1691,6 @@ KeyBindingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     if(item) ((MenuProc *) item->proc) ();
 }
 
-static void
-MenuEngineSelect (Widget w, caddr_t addr, caddr_t index)
-{
-    RecentEngineEvent((int) (intptr_t) addr);
-}
-
-void
-AppendMenuItem (char *msg, int n)
-{
-    CreateMenuItem((Widget) optList[W_ENGIN].textValue, msg, (XtCallbackProc) MenuEngineSelect, n);
-}
-
 void
 SetupDropMenu ()
 {
@@ -1795,7 +1850,7 @@ HandlePV (Widget w, XEvent * event, String * params, Cardinal * nParams)
     MovePV(event->xmotion.x, event->xmotion.y, lineGap + BOARD_HEIGHT * (squareSize + lineGap));
 }
 
-static int savedIndex;  /* gross that this is global */
+extern int savedIndex;  /* gross that this is global */
 
 void
 CommentClick (Widget w, XEvent * event, String * params, Cardinal * nParams)
@@ -1812,27 +1867,6 @@ CommentClick (Widget w, XEvent * event, String * params, Cardinal * nParams)
        LoadVariation( index, val ); // [HGM] also does the actual moving to it, now
 }
 
-void
-EditCommentPopUp (int index, char *title, char *text)
-{
-    savedIndex = index;
-    if (text == NULL) text = "";
-    NewCommentPopup(title, text, index);
-}
-
-void
-CommentPopUp (char *title, char *text)
-{
-    savedIndex = currentMove; // [HGM] vari
-    NewCommentPopup(title, text, currentMove);
-}
-
-void
-CommentPopDown ()
-{
-    PopDown(CommentDlg);
-}
-
 
 /* Disable all user input other than deleting the window */
 static int frozen = 0;
@@ -2402,6 +2436,19 @@ SetClockIcon (int color)
     }
 }
 
+#define INPUT_SOURCE_BUF_SIZE 8192
+
+typedef struct {
+    CPKind kind;
+    int fd;
+    int lineByLine;
+    char *unused;
+    InputCallback func;
+    XtInputId xid;
+    char buf[INPUT_SOURCE_BUF_SIZE];
+    VOIDSTAR closure;
+} InputSource;
+
 void
 DoInputCallback (caddr_t closure, int *source, XtInputId *xid)
 {