Merge commit 'v4.4.1.20091019' into gtk
[xboard.git] / callback.c
index 2aec851..0f481f0 100644 (file)
@@ -1,5 +1,6 @@
 #include <gtk/gtk.h>
 #include "common.h"
+#include "xboard.h"
 #include <errno.h>
 #include "backend.h"
 
 # define N_(s)  s
 #endif
 
-
 extern GtkWidget  *about;
 extern GtkWidget  *GUI_Window;
+extern GtkWidget  *GUI_Aspect;
+extern GtkWidget  *GUI_Menubar;
+extern GtkWidget  *GUI_Timer;
+extern GtkWidget  *GUI_Buttonbar;
+extern GtkWidget  *GUI_Board;
 
 extern char *programVersion;
 extern int errorExitStatus;
@@ -22,8 +27,59 @@ extern int fromX;
 extern int fromY;
 extern int toX;
 extern int toY;
+extern int squareSize,lineGap;
 
-void 
+extern int LoadGamePopUp P((FILE *f, int gameNumber, char *title));
+extern int LoadPosition P((FILE *f, int gameNumber, char *title));
+extern int SaveGame P((FILE *f, int gameNumber, char *title));
+extern int SavePosition P((FILE *f, int gameNumber, char *title));
+
+gboolean
+ExposeProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  /* do resizing to a fixed aspect ratio */
+  GtkRequisition w;
+  int totalh=0,nw,nh;
+  float ratio;
+  int boardWidth,boardHeight,old,new;
+
+  nw=GTK_WIDGET(object)->allocation.width;
+  nh=GTK_WIDGET(object)->allocation.height;
+
+  old=squareSize;
+  squareSize  = nw/(BOARD_WIDTH*1.05+0.05);
+
+  if(old!=squareSize)
+    {
+      lineGap = squareSize*0.05;
+
+      boardWidth  = lineGap + BOARD_WIDTH  * (squareSize + lineGap);
+      boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap);
+
+      /* get the height of the menus, etc. and calculate the aspect ratio */
+      gtk_widget_size_request(GTK_WIDGET(GUI_Menubar),   &w);
+      totalh += w.height;
+      gtk_widget_size_request(GTK_WIDGET(GUI_Timer),   &w);
+      totalh += w.height;
+      gtk_widget_size_request(GTK_WIDGET(GUI_Buttonbar),   &w);
+      totalh += w.height;
+
+      ratio  = ((float)totalh+boardHeight)/((float)boardWidth) ;
+
+      gtk_widget_set_size_request(GTK_WIDGET(GUI_Board),
+                                 boardWidth,boardHeight);
+
+      gtk_aspect_frame_set (GTK_ASPECT_FRAME(GUI_Aspect),0,0,ratio,TRUE);
+
+      /* recreate pieces with new size... TODO: keep svg in memory and just recreate pixmap instead of reloading files */
+      CreatePieces();
+    }
+  return FALSE; /* return false, so that other expose events are called too */
+}
+
+void
 QuitProc (object, user_data)
      GtkObject *object;
      gpointer user_data;
@@ -32,6 +88,44 @@ QuitProc (object, user_data)
   ExitEvent(0);
 }
 
+/* Help Menu */
+void InfoProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    char buf[MSG_SIZ];
+    snprintf(buf, sizeof(buf), "xterm -e info --directory %s --directory . -f %s &",
+           INFODIR, INFOFILE);
+    system(buf);
+    return;
+}
+
+void ManProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    char buf[MSG_SIZ];
+    snprintf(buf, sizeof(buf), "xterm -e man xboard &");
+    system(buf);
+    return;
+}
+
+void HintProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    HintEvent();
+    return;
+}
+
+void BookProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    BookEvent();
+    return;
+}
+
 void AboutProc (object, user_data)
      GtkObject *object;
      gpointer user_data;
@@ -49,7 +143,7 @@ void AboutProc (object, user_data)
                            "H.G. Muller <h.g.muller AT hccnet DOT nl>",
                            "Eric Mullins <emwine AT earthlink DOT net>",
                            "Arun Persaud <arun@nubati.net>"};
-  
+
   /* set up about window */
   about =  GTK_WIDGET(gtk_about_dialog_new());
 
@@ -61,10 +155,10 @@ void AboutProc (object, user_data)
   char *zippy = "";
 #endif
   sprintf(buf, "%s%s",  programVersion, zippy);
-  
+
   gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about),buf);
 
-  gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about), 
+  gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about),
                                 "Copyright 1991 Digital Equipment Corporation\n"
                                 "Enhancements Copyright 1992-2009 Free Software Foundation\n"
                                 "Enhancements Copyright 2005 Alessandro Scotti");
@@ -73,13 +167,28 @@ void AboutProc (object, user_data)
   gtk_about_dialog_set_translator_credits(GTK_ABOUT_DIALOG(about),
                                          " A. Alper (turkish)\n"
                                          " A. Persaud (german)\n");
-  
+
   /* end set up about window */
   gtk_dialog_run(GTK_DIALOG (about));
   gtk_widget_destroy(about);
 }
 
-void LoadNextGameProc(object, user_data)
+/* End Help Menu */
+
+void IcsClientProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    IcsClientEvent();
+    return;
+}
+
+/*
+ * File menu
+ */
+
+void
+LoadNextGameProc(object, user_data)
      GtkObject *object;
      gpointer user_data;
 {
@@ -87,7 +196,8 @@ void LoadNextGameProc(object, user_data)
     return;
 }
 
-void LoadPrevGameProc(object, user_data)
+void
+LoadPrevGameProc(object, user_data)
      GtkObject *object;
      gpointer user_data;
 {
@@ -95,7 +205,8 @@ void LoadPrevGameProc(object, user_data)
     return;
 }
 
-void ReloadGameProc(object, user_data)
+void
+ReloadGameProc(object, user_data)
      GtkObject *object;
      gpointer user_data;
 {
@@ -103,6 +214,510 @@ void ReloadGameProc(object, user_data)
     return;
 }
 
+void
+LoadNextPositionProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    ReloadPosition(1);
+    return;
+}
+
+void
+LoadPrevPositionProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    ReloadPosition(-1);
+    return;
+}
+
+void
+ReloadPositionProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    ReloadPosition(0);
+    return;
+}
+
+void
+LoadPositionProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  if (gameMode == AnalyzeMode || gameMode == AnalyzeFile)
+    {
+      Reset(FALSE, TRUE);
+    };
+
+  FileNamePopUp(_("Load position file name?"), "", LoadPosition, "rb");
+  return;
+}
+
+void
+SaveGameProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  FileNamePopUp(_("Save game file name?"),
+               DefaultFileName(appData.oldSaveStyle ? "game" : "pgn"),
+               SaveGame, "a");
+  return;
+}
+
+void
+SavePositionProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  FileNamePopUp(_("Save position file name?"),
+               DefaultFileName(appData.oldSaveStyle ? "pos" : "fen"),
+               SavePosition, "a");
+  return;
+}
+
+void
+AnalyzeFileProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  if (!first.analysisSupport)
+    {
+      char buf[MSG_SIZ];
+      snprintf(buf, sizeof(buf), _("%s does not support analysis"), first.tidy);
+      DisplayError(buf, 0);
+      return;
+    };
+  Reset(FALSE, TRUE);
+
+  if (!appData.showThinking)
+    ShowThinkingProc(NULL,NULL);
+
+  AnalyzeFileEvent();
+  FileNamePopUp(_("File to analyze"), "", LoadGamePopUp, "rb");
+  AnalysisPeriodicEvent(1);
+  return;
+}
+
+
+/* End File Menu */
+
+void MachineWhiteProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    MachineWhiteEvent();
+    return;
+}
+
+void MachineBlackProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    MachineBlackEvent();
+    return;
+}
+
+void TwoMachinesProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    TwoMachinesEvent();
+    return;
+}
+
+void AcceptProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    AcceptEvent();
+    return;
+}
+
+void DeclineProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    DeclineEvent();
+    return;
+}
+
+void RematchProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    RematchEvent();
+    return;
+}
+
+void CallFlagProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    CallFlagEvent();
+    return;
+}
+
+void DrawProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    DrawEvent();
+    return;
+}
+
+void AbortProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    AbortEvent();
+    return;
+}
+
+void AdjournProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    AdjournEvent();
+    return;
+}
+
+void ResignProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    ResignEvent();
+    return;
+}
+
+void StopObservingProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    StopObservingEvent();
+    return;
+}
+
+void StopExaminingProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    StopExaminingEvent();
+    return;
+}
+
+void AdjuWhiteProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    UserAdjudicationEvent(+1);
+    return;
+}
+
+void AdjuBlackProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    UserAdjudicationEvent(-1);
+    return;
+}
+
+void AdjuDrawProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    UserAdjudicationEvent(0);
+    return;
+}
+
+void BackwardProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    BackwardEvent();
+    return;
+}
+
+void ForwardProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    ForwardEvent();
+    return;
+}
+
+void ToStartProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    ToStartEvent();
+    return;
+}
+
+void ToEndProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    ToEndEvent();
+    return;
+}
+
+void RevertProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    RevertEvent();
+    return;
+}
+
+void TruncateGameProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    TruncateGameEvent();
+    return;
+}
+
+void MoveNowProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    MoveNowEvent();
+    return;
+}
+
+void RetractMoveProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    RetractMoveEvent();
+    return;
+}
+
+/* Option Menu */
+void 
+AutocommProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    appData.autoComment = !appData.autoComment;
+    return;
+}
+
+void 
+AutoflagProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    appData.autoCallFlag = !appData.autoCallFlag;
+    return;
+}
+
+void 
+AutoflipProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    appData.autoFlipView = !appData.autoFlipView;
+    return;
+}
+
+void 
+ShowThinkingProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    appData.showThinking = !appData.showThinking;
+    ShowThinkingEvent();
+
+    return;
+}
+
+void 
+HideThinkingProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    appData.hideThinkingFromHuman = !appData.hideThinkingFromHuman;
+    ShowThinkingEvent();
+
+    return;
+}
+
+void 
+FlipViewProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+    flipView = !flipView;
+    DrawPosition(True, NULL);
+    return;
+}
+
+void 
+AlwaysQueenProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.alwaysPromoteToQueen = !appData.alwaysPromoteToQueen;
+  return;
+}
+
+void 
+AnimateDraggingProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.animateDragging = !appData.animateDragging;
+
+  if (appData.animateDragging) 
+    {
+      // TODO convert to gtk
+      //      CreateAnimVars();
+    };
+
+  return;
+}
+
+void 
+AnimateMovingProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.animate = !appData.animate;
+  
+  if (appData.animate) 
+    {
+      // TODO convert to gtk
+      //      CreateAnimVars();
+    };
+
+  return;
+}
+
+void 
+AutobsProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.autoObserve = !appData.autoObserve;
+  return;
+}
+
+void 
+AutoraiseProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.autoRaiseBoard = !appData.autoRaiseBoard;
+  return;
+}
+
+void 
+AutosaveProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.autoSaveGames = !appData.autoSaveGames;
+  return;
+}
+
+void 
+BlindfoldProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.blindfold = !appData.blindfold;
+  DrawPosition(True, NULL);
+  return;
+}
+
+void 
+TestLegalityProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.testLegality = !appData.testLegality;
+  return;
+}
+
+void 
+FlashMovesProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  if (appData.flashCount == 0) 
+    {
+      appData.flashCount = 3;
+    }
+  else 
+    {
+      appData.flashCount = -appData.flashCount;
+    };
+  
+    // TODO: check if this is working correct*/
+    return;
+}
+
+#if HIGHDRAG
+void 
+HighlightDraggingProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  /* TODO: connect to option menu */
+  appData.highlightDragging = !appData.highlightDragging;
+  return;
+}
+#endif
+
+void 
+HighlightLastMoveProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.highlightLastMove = !appData.highlightLastMove;
+  return;
+}
+
+void 
+IcsAlarmProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.icsAlarm = !appData.icsAlarm;
+  return;
+}
+
+void 
+MoveSoundProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.ringBellAfterMoves = !appData.ringBellAfterMoves;
+  return;
+}
+
+void 
+OldSaveStyleProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.oldSaveStyle = !appData.oldSaveStyle;
+  return;
+}
+
+void 
+PeriodicUpdatesProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  PeriodicUpdatesEvent(!appData.periodicUpdates);
+  return;
+}
+
+/* end option menu */
 
 gboolean CloseWindowProc(GtkWidget *button)
 {
@@ -110,13 +725,13 @@ gboolean CloseWindowProc(GtkWidget *button)
     return TRUE;
 }
 
-void 
+void
 ResetProc (object, user_data)
      GtkObject *object;
      gpointer user_data;
 {
-  ResetGameEvent(); 
-  AnalysisPopDown();
+  ResetGameEvent();
+  return;
 }
 
 void WhiteClockProc(object, user_data)
@@ -165,8 +780,6 @@ void PauseProc(object, user_data)
 {
     // todo this toggling of the pause button doesn't seem to work?
     // e.g. select pause from buttonbar doesn't activate menumode.pause
-  //  fprintf(stderr,"DEBUG: in pause\n");
-  //  fflush(stderr);
   PauseEvent();
 }
 
@@ -175,32 +788,8 @@ void LoadGameProc(object, user_data)
      GtkObject *object;
      gpointer user_data;
 {
-  GtkWidget *dialog;
-  dialog = gtk_file_chooser_dialog_new (_("Load game file name?"),
-                                       GTK_WINDOW(GUI_Window),
-                                       GTK_FILE_CHOOSER_ACTION_OPEN,
-                                       GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                       GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
-                                       NULL);
-  if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
-    {
-      char *filename;
-      FILE *f;
-
-      filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
-
-      //see loadgamepopup
-      f = fopen(filename, "rb");
-      if (f == NULL) {
-       DisplayError(_("Failed to open file"), errno);
-      } else {
-       /* TODO add indec */
-       (void) LoadGamePopUp(f, 0, filename);
-      }
-      g_free (filename);
-    }
-  gtk_widget_destroy (dialog);
-  ModeHighlight();
+  FileNamePopUp(_("Load game file name?"),"",LoadGamePopUp,"rb");
+  return;
 }
 
 
@@ -213,11 +802,11 @@ void EventProc(window, event, data)
      GdkEvent *event;
      gpointer data;
 {
-  /* todo do we still need this? 
+  /* todo do we still need this?
     if (!XtIsRealized(widget))
       return;
   */
-  
+
     switch (event->type) {
       case GDK_EXPOSE:
        if (event->expose.count > 0) return;  /* no clipping is done */
@@ -245,45 +834,53 @@ void UserMoveProc(window, event, data)
 
     if (event->type == GDK_BUTTON_PRESS) ErrorPopDown();
 
-    if (promotionUp) {
-       if (event->type == GDK_BUTTON_PRESS) {
-         /* todo add promotionshellwidget
-           XtPopdown(promotionShell);
-           XtDestroyWidget(promotionShell); */
+    if (promotionUp)
+      {
+       if (event->type == GDK_BUTTON_PRESS)
+         {
+           /* todo add promotionshellwidget
+              XtPopdown(promotionShell);
+              XtDestroyWidget(promotionShell); */
            promotionUp = False;
            ClearHighlights();
            fromX = fromY = -1;
-       } else {
+         }
+       else
+         {
            return;
-       }
-    }
-    
-    x = EventToSquare((int)event->button.x, BOARD_WIDTH);
-    y = EventToSquare((int)event->button.y, BOARD_HEIGHT);
-    if (!flipView && y >= 0) {
+         }
+      }
+
+    x = EventToSquare( (int)event->button.x, BOARD_WIDTH  );
+    y = EventToSquare( (int)event->button.y, BOARD_HEIGHT );
+    if (!flipView && y >= 0)
+      {
        y = BOARD_HEIGHT - 1 - y;
-    }
-    if (flipView && x >= 0) {
+      }
+    if (flipView && x >= 0)
+      {
        x = BOARD_WIDTH - 1 - x;
-    }
-    printf("DEBUG::UserMoveProc: x %d y %d\n",x,y);
-    
-    if (fromX == -1) {
-       if (event->type == ButtonPress) {
+      }
+
+    if (fromX == -1)
+      {
+       if (event->type == ButtonPress)
+         {
            /* First square */
-           if (OKToStartUserMove(x, y)) {
+           if (OKToStartUserMove(x, y))
+             {
                fromX = x;
                fromY = y;
                second = 0;
-    printf("DEBUG::UserMoveProc: a\n");
                DragPieceBegin(event->button.x, event->button.y);
-               if (appData.highlightDragging) {
+               if (appData.highlightDragging)
+                 {
                    SetHighlights(x, y, -1, -1);
-               }
-           }
-       }
+                 }
+             }
+         }
        return;
-    }
+      }
 
     /* fromX != -1 */
     if (event->type == GDK_BUTTON_PRESS && gameMode != EditPosition &&
@@ -293,7 +890,6 @@ void UserMoveProc(window, event, data)
        /* Check if clicking again on the same color piece */
        fromP = boards[currentMove][fromY][fromX];
        toP = boards[currentMove][y][x];
-    printf("DEBUG::UserMoveProc: b\n");
        if ((WhitePawn <= fromP && fromP <= WhiteKing &&
             WhitePawn <= toP && toP <= WhiteKing) ||
            (BlackPawn <= fromP && fromP <= BlackKing &&
@@ -314,76 +910,110 @@ void UserMoveProc(window, event, data)
        }
     }
 
-    if (event->type == GDK_BUTTON_RELEASE &&   x == fromX && y == fromY) {
-    printf("DEBUG::UserMoveProc: c\n");
+    if (event->type == GDK_BUTTON_RELEASE &&   x == fromX && y == fromY)
+      {
        DragPieceEnd(event->button.x, event->button.y);
-       if (appData.animateDragging) {
+       if (appData.animateDragging)
+         {
            /* Undo animation damage if any */
            DrawPosition(FALSE, NULL);
-       }
-       if (second) {
+         }
+       if (second)
+         {
            /* Second up/down in same square; just abort move */
            second = 0;
            fromX = fromY = -1;
            ClearHighlights();
            gotPremove = 0;
            ClearPremoveHighlights();
-       } else {
+         }
+       else
+         {
            /* First upclick in same square; start click-click mode */
            SetHighlights(x, y, -1, -1);
-       }
+         }
        return;
-    }
+      }
 
     /* Completed move */
     toX = x;
     toY = y;
     saveAnimate = appData.animate;
-    printf("DEBUG::UserMoveProc: d\n");
-    if (event->type == GDK_BUTTON_PRESS) {
-    printf("DEBUG::UserMoveProc: e\n");
+
+    if (event->type == GDK_BUTTON_PRESS)
+      {
        /* Finish clickclick move */
-       if (appData.animate || appData.highlightLastMove) {
+       if (appData.animate || appData.highlightLastMove)
+         {
            SetHighlights(fromX, fromY, toX, toY);
-       } else {
+         }
+       else
+         {
            ClearHighlights();
-       }
-    } else {
+         }
+      }
+    else
+      {
        /* Finish drag move */
-       if (appData.highlightLastMove) {
+       if (appData.highlightLastMove)
+         {
            SetHighlights(fromX, fromY, toX, toY);
-       } else {
+         }
+       else
+         {
            ClearHighlights();
-       }
+         }
        DragPieceEnd(event->button.x, event->button.y);
        /* Don't animate move and drag both */
        appData.animate = FALSE;
-    }
-    printf("DEBUG::UserMoveProc: f\n");
-    if (IsPromotion(fromX, fromY, toX, toY)) {
-    printf("DEBUG::UserMoveProc: f1\n");
-       if (appData.alwaysPromoteToQueen) {
+      }
+
+    if (IsPromotion(fromX, fromY, toX, toY))
+      {
+       if (appData.alwaysPromoteToQueen)
+         {
            UserMoveEvent(fromX, fromY, toX, toY, 'q');
            if (!appData.highlightLastMove || gotPremove) ClearHighlights();
            if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY);
            fromX = fromY = -1;
-       } else {
+         }
+       else
+         {
            SetHighlights(fromX, fromY, toX, toY);
            PromotionPopUp();
-       }
-    } else {
-    printf("DEBUG::UserMoveProc: f2\n");
-    
+         }
+      }
+    else
+      {
        UserMoveEvent(fromX, fromY, toX, toY, NULLCHAR);
-    printf("DEBUG::UserMoveProc: f3\n");
+
        if (!appData.highlightLastMove || gotPremove) ClearHighlights();
        if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY);
        fromX = fromY = -1;
-    }
+      }
+
     appData.animate = saveAnimate;
-    printf("DEBUG::UserMoveProc: g\n");
     if (appData.animate || appData.animateDragging) {
        /* Undo animation damage if needed */
        DrawPosition(FALSE, NULL);
     }
+
+    return;
+}
+
+void GetMoveListProc(object, user_data)
+     GtkObject *object;
+     gpointer user_data;
+{
+  appData.getMoveList = !appData.getMoveList;
+
+  if (appData.getMoveList)
+    {
+      GetMoveListEvent();
+    }
+
+  // gets set automatically? if we set it with set_active we end up in an endless loop switching between 0 and 1
+  //  gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (object),(gboolean) appData.getMoveList );
+
+  return;
 }