Move some back-endish routines from xboard.c to dialogs.c
[xboard.git] / xboard.c
index 934f903..51182a5 100644 (file)
--- a/xboard.c
+++ b/xboard.c
@@ -205,6 +205,7 @@ extern char *getenv();
 #include "xedittags.h"
 #include "menus.h"
 #include "board.h"
+#include "dialogs.h"
 #include "gettext.h"
 
 
@@ -229,8 +230,8 @@ FILE * XsraSelFile P((Widget w, char *prompt, char *ok, char *cancel, char *fail
 RETSIGTYPE CmailSigHandler P((int sig));
 RETSIGTYPE IntSigHandler P((int sig));
 RETSIGTYPE TermSizeSigHandler P((int sig));
-void CreateGCs P((int redo));
-void CreateAnyPieces P((void));
+static void CreateGCs P((int redo));
+static void CreateAnyPieces P((void));
 void CreateXIMPieces P((void));
 void CreateXPMPieces P((void));
 void CreateXPMBoard P((char *s, int n));
@@ -254,7 +255,7 @@ void CreateGrid P((void));
 int EventToSquare P((int x, int limit));
 void EventProc P((Widget widget, caddr_t unused, XEvent *event));
 void DelayedDrag P((void));
-void MoveTypeInProc P((Widget widget, caddr_t unused, XEvent *event));
+static void MoveTypeInProc P((Widget widget, caddr_t unused, XEvent *event));
 void HandleUserMove P((Widget w, XEvent *event,
                     String *prms, Cardinal *nprms));
 void AnimateUserMove P((Widget w, XEvent * event,
@@ -297,19 +298,15 @@ void PromotionCallback P((Widget w, XtPointer client_data,
 void SelectCommand P((Widget w, XtPointer client_data, XtPointer call_data));
 void KeyBindingProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void QuitWrapper P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void TypeInProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void EnterKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void UpKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
-void DownKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
+static void EnterKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
+static void UpKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
+static void DownKeyProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 void TempBackwardProc P((Widget w, XEvent *event, String *prms, Cardinal *nprms));
 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 DisplayTitle P((char *title));
 void ICSInitScript P((void));
-void ErrorPopUp P((char *title, char *text, int modal));
-void ErrorPopDown P((void));
 static char *ExpandPathName P((char *path));
 void SelectMove P((Widget w, XEvent * event, String * params, Cardinal * nParams));
 void GameListOptionsPopDown P(());
@@ -392,8 +389,6 @@ WindowPlacement wpEngineOutput;
 WindowPlacement wpGameList;
 WindowPlacement wpTags;
 
-extern Widget shells[];
-extern Boolean shellUp[];
 
 #define SOLID 0
 #define OUTLINE 1
@@ -1115,11 +1110,11 @@ GetWindowCoords ()
   // In XBoard this will have to wait until awareness of window parameters is implemented
   GetActualPlacement(shellWidget, &wpMain);
   if(EngineOutputIsUp()) GetActualPlacement(engineOutputShell, &wpEngineOutput);
-  if(MoveHistoryIsUp()) GetActualPlacement(shells[7], &wpMoveHistory);
+  if(MoveHistoryIsUp()) GetActualPlacement(shells[HistoryDlg], &wpMoveHistory);
   if(EvalGraphIsUp()) GetActualPlacement(evalGraphShell, &wpEvalGraph);
   if(GameListIsUp()) GetActualPlacement(gameListShell, &wpGameList);
-  if(shellUp[1]) GetActualPlacement(shells[1], &wpComment);
-  if(shellUp[2]) GetActualPlacement(shells[2], &wpTags);
+  if(shellUp[CommentDlg]) GetActualPlacement(shells[CommentDlg], &wpComment);
+  if(shellUp[TagsDlg]) GetActualPlacement(shells[TagsDlg], &wpTags);
 }
 
 void
@@ -1187,8 +1182,6 @@ ConvertToLine (int argc, char **argv)
 
 //--------------------------------------------------------------------------------------------
 
-extern Boolean twoBoards, partnerUp;
-
 #ifdef IDSIZES
   // eventually, all layout determining code should go into a subroutine, but until then IDSIZE remains undefined
 #else
@@ -1386,7 +1379,7 @@ ParseIcsTextColors ()
       }
 }
 
-int
+static int
 MakeOneColor (char *name, Pixel *color)
 {
     XrmValue vFrom, vTo;
@@ -1404,7 +1397,7 @@ MakeOneColor (char *name, Pixel *color)
     return False;
 }
 
-int
+static int
 MakeColors ()
 {   // [HGM] taken out of main(), so it can be called from BoardOptions dialog
     int forceMono = False;
@@ -1419,7 +1412,7 @@ MakeColors ()
     return forceMono;
 }
 
-void
+static void
 CreateAnyPieces ()
 {   // [HGM] taken out of main
 #if HAVE_LIBXPM
@@ -1441,6 +1434,13 @@ CreateAnyPieces ()
 #endif
 }
 
+void
+InitDrawingParams ()
+{
+    MakeColors(); CreateGCs(True);
+    CreateAnyPieces();
+}
+
 int
 main (int argc, char **argv)
 {
@@ -2192,51 +2192,6 @@ ResetFrontEnd ()
     return;
 }
 
-// [HGM] code borrowed from winboard.c (which should thus go to backend.c!)
-#define HISTORY_SIZE 64
-static char *history[HISTORY_SIZE];
-int histIn = 0, histP = 0;
-
-void
-SaveInHistory (char *cmd)
-{
-  if (history[histIn] != NULL) {
-    free(history[histIn]);
-    history[histIn] = NULL;
-  }
-  if (*cmd == NULLCHAR) return;
-  history[histIn] = StrSave(cmd);
-  histIn = (histIn + 1) % HISTORY_SIZE;
-  if (history[histIn] != NULL) {
-    free(history[histIn]);
-    history[histIn] = NULL;
-  }
-  histP = histIn;
-}
-
-char *
-PrevInHistory (char *cmd)
-{
-  int newhp;
-  if (histP == histIn) {
-    if (history[histIn] != NULL) free(history[histIn]);
-    history[histIn] = StrSave(cmd);
-  }
-  newhp = (histP - 1 + HISTORY_SIZE) % HISTORY_SIZE;
-  if (newhp == histIn || history[newhp] == NULL) return NULL;
-  histP = newhp;
-  return history[histP];
-}
-
-char *
-NextInHistory ()
-{
-  if (histP == histIn) return NULL;
-  histP = (histP + 1) % HISTORY_SIZE;
-  return history[histP];   
-}
-// end of borrowed code
-
 #define Abs(n) ((n)<0 ? -(n) : (n))
 
 #ifdef ENABLE_NLS
@@ -2429,7 +2384,7 @@ CreateOneGC (XGCValues *gc_values, Pixel foreground, Pixel background)
     return XtGetGC(shellWidget, value_mask, gc_values);
 }
 
-void
+static void
 CreateGCs (int redo)
 {
     XtGCMask value_mask = GCLineWidth | GCLineStyle | GCForeground
@@ -3664,7 +3619,7 @@ DragProc ()
           wpNew.width == wpMain.width && wpNew.height == wpMain.height) // not sized
            return; // false alarm
        if(EngineOutputIsUp()) CoDrag(engineOutputShell, &wpEngineOutput);
-       if(MoveHistoryIsUp()) CoDrag(shells[7], &wpMoveHistory);
+       if(MoveHistoryIsUp()) CoDrag(shells[HistoryDlg], &wpMoveHistory);
        if(EvalGraphIsUp()) CoDrag(evalGraphShell, &wpEvalGraph);
        if(GameListIsUp()) CoDrag(gameListShell, &wpGameList);
        wpMain = wpNew;
@@ -3842,27 +3797,9 @@ ICSInputBoxPopUp ()
 extern Option boxOptions[];
 
 void
-ICSInputSendText ()
-{
-    Widget edit;
-    int j;
-    Arg args[16];
-    String val;
-
-    edit = boxOptions[0].handle;
-    j = 0;
-    XtSetArg(args[j], XtNstring, &val); j++;
-    XtGetValues(edit, args, j);
-    SaveInHistory(val);
-    SendMultiLineToICS(val);
-    XtCallActionProc(edit, "select-all", NULL, NULL, 0);
-    XtCallActionProc(edit, "kill-selection", NULL, NULL, 0);
-}
-
-void
 ICSInputBoxPopDown ()
 {
-    PopDown(4);
+    PopDown(InputBoxDlg);
 }
 
 void
@@ -3875,7 +3812,7 @@ CommentPopUp (char *title, char *text)
 void
 CommentPopDown ()
 {
-    PopDown(1);
+    PopDown(CommentDlg);
 }
 
 static char *openName;
@@ -4124,7 +4061,7 @@ ErrorPopUp (char *title, char *label, int modal)
     XtSetArg(args[i], XtNtitle, title); i++;
     errorShell =
       XtCreatePopupShell("errorpopup", transientShellWidgetClass,
-                        shellUp[0] ? (dialogError = modal = TRUE, shells[0]) : shellWidget, args, i);
+                        shellUp[TransientDlg] ? (dialogError = modal = TRUE, shells[TransientDlg]) : shellWidget, args, i);
     layout =
       XtCreateManagedWidget(layoutName, formWidgetClass, errorShell,
                            layoutArgs, XtNumber(layoutArgs));
@@ -4492,54 +4429,40 @@ QuitWrapper (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     QuitProc();
 }
 
-void
+static void
+MoveTypeInProc (Widget widget, caddr_t unused, XEvent *event)
+{
+    char buf[10], keys[32];
+    KeySym sym;
+    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);
+//    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
+       ) BoxAutoPopUp (buf);
+}
+
+static void
 UpKeyProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {   // [HGM] input: let up-arrow recall previous line from history
-    Widget edit;
-    int j;
-    Arg args[16];
-    String val;
-    XawTextBlock t;
-
-    if (!shellUp[4]) return;
-    edit = boxOptions[0].handle;
-    j = 0;
-    XtSetArg(args[j], XtNstring, &val); j++;
-    XtGetValues(edit, args, j);
-    val = PrevInHistory(val);
-    XtCallActionProc(edit, "select-all", NULL, NULL, 0);
-    XtCallActionProc(edit, "kill-selection", NULL, NULL, 0);
-    if(val) {
-       t.ptr = val; t.firstPos = 0; t.length = strlen(val); t.format = XawFmt8Bit;
-       XawTextReplace(edit, 0, 0, &t);
-       XawTextSetInsertionPoint(edit, 9999);
-    }
+    IcsKey(1);
 }
 
-void
+static void
 DownKeyProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {   // [HGM] input: let down-arrow recall next line from history
-    Widget edit;
-    String val;
-    XawTextBlock t;
-
-    if (!shellUp[4]) return;
-    edit = boxOptions[0].handle;
-    val = NextInHistory();
-    XtCallActionProc(edit, "select-all", NULL, NULL, 0);
-    XtCallActionProc(edit, "kill-selection", NULL, NULL, 0);
-    if(val) {
-       t.ptr = val; t.firstPos = 0; t.length = strlen(val); t.format = XawFmt8Bit;
-       XawTextReplace(edit, 0, 0, &t);
-       XawTextSetInsertionPoint(edit, 9999);
-    }
+    IcsKey(-1);
 }
 
-void
+static void
 EnterKeyProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {
-    if (shellUp[4] == True)
-      ICSInputSendText();
+    IcsKey(0);
 }
 
 void
@@ -4616,48 +4539,15 @@ DisplayMessage (char *message, char *extMessage)
 }
 
 void
-DisplayTitle (char *text)
+SetWindowTitle (char *text, char *title, char *icon)
 {
     Arg args[16];
     int i;
-    char title[MSG_SIZ];
-    char icon[MSG_SIZ];
-
-    if (text == NULL) text = "";
-
     if (appData.titleInWindow) {
        i = 0;
        XtSetArg(args[i], XtNlabel, text);   i++;
        XtSetValues(titleWidget, args, i);
     }
-
-    if (*text != NULLCHAR) {
-      safeStrCpy(icon, text, sizeof(icon)/sizeof(icon[0]) );
-      safeStrCpy(title, text, sizeof(title)/sizeof(title[0]) );
-    } else if (appData.icsActive) {
-        snprintf(icon, sizeof(icon), "%s", appData.icsHost);
-       snprintf(title, sizeof(title), "%s: %s", programName, appData.icsHost);
-    } else if (appData.cmailGameName[0] != NULLCHAR) {
-        snprintf(icon, sizeof(icon), "%s", "CMail");
-       snprintf(title,sizeof(title), "%s: %s", programName, "CMail");
-#ifdef GOTHIC
-    // [HGM] license: This stuff should really be done in back-end, but WinBoard already had a pop-up for it
-    } else if (gameInfo.variant == VariantGothic) {
-      safeStrCpy(icon,  programName, sizeof(icon)/sizeof(icon[0]) );
-      safeStrCpy(title, GOTHIC,     sizeof(title)/sizeof(title[0]) );
-#endif
-#ifdef FALCON
-    } else if (gameInfo.variant == VariantFalcon) {
-      safeStrCpy(icon, programName, sizeof(icon)/sizeof(icon[0]) );
-      safeStrCpy(title, FALCON, sizeof(title)/sizeof(title[0]) );
-#endif
-    } else if (appData.noChessProgram) {
-      safeStrCpy(icon, programName, sizeof(icon)/sizeof(icon[0]) );
-      safeStrCpy(title, programName, sizeof(title)/sizeof(title[0]) );
-    } else {
-      safeStrCpy(icon, first.tidy, sizeof(icon)/sizeof(icon[0]) );
-       snprintf(title,sizeof(title), "%s: %s", programName, first.tidy);
-    }
     i = 0;
     XtSetArg(args[i], XtNiconName, (XtArgVal) icon);    i++;
     XtSetArg(args[i], XtNtitle, (XtArgVal) title);      i++;
@@ -4666,79 +4556,6 @@ DisplayTitle (char *text)
 }
 
 
-void
-DisplayError (String message, int error)
-{
-    char buf[MSG_SIZ];
-
-    if (error == 0) {
-       if (appData.debugMode || appData.matchMode) {
-           fprintf(stderr, "%s: %s\n", programName, message);
-       }
-    } else {
-       if (appData.debugMode || appData.matchMode) {
-           fprintf(stderr, "%s: %s: %s\n",
-                   programName, message, strerror(error));
-       }
-       snprintf(buf, sizeof(buf), "%s: %s", message, strerror(error));
-       message = buf;
-    }
-    ErrorPopUp(_("Error"), message, FALSE);
-}
-
-
-void
-DisplayMoveError (String message)
-{
-    fromX = fromY = -1;
-    ClearHighlights();
-    DrawPosition(FALSE, NULL);
-    if (appData.debugMode || appData.matchMode) {
-       fprintf(stderr, "%s: %s\n", programName, message);
-    }
-    if (appData.popupMoveErrors) {
-       ErrorPopUp(_("Error"), message, FALSE);
-    } else {
-       DisplayMessage(message, "");
-    }
-}
-
-
-void
-DisplayFatalError (String message, int error, int status)
-{
-    char buf[MSG_SIZ];
-
-    errorExitStatus = status;
-    if (error == 0) {
-       fprintf(stderr, "%s: %s\n", programName, message);
-    } else {
-       fprintf(stderr, "%s: %s: %s\n",
-               programName, message, strerror(error));
-       snprintf(buf, sizeof(buf), "%s: %s", message, strerror(error));
-       message = buf;
-    }
-    if (appData.popupExitMessage && boardWidget && XtIsRealized(boardWidget)) {
-      ErrorPopUp(status ? _("Fatal Error") : _("Exiting"), message, TRUE);
-    } else {
-      ExitEvent(status);
-    }
-}
-
-void
-DisplayInformation (String message)
-{
-    ErrorPopDown();
-    ErrorPopUp(_("Information"), message, TRUE);
-}
-
-void
-DisplayNote (String message)
-{
-    ErrorPopDown();
-    ErrorPopUp(_("Note"), message, FALSE);
-}
-
 static int
 NullXErrorCheck (Display *dpy, XErrorEvent *error_event)
 {