8 # define _(s) gettext (s)
9 # define N_(s) gettext_noop (s)
15 extern GtkWidget *about;
16 extern GtkWidget *GUI_Window;
17 extern GtkWidget *GUI_Menubar;
18 extern GtkWidget *GUI_Timer;
19 extern GtkWidget *GUI_Buttonbar;
20 extern GtkWidget *GUI_Board;
22 extern char *programVersion;
23 extern int errorExitStatus;
24 extern int promotionUp;
29 extern int squareSize,lineGap;
32 ExposeProc(object, user_data)
36 /* do resizing to a fixed aspect ratio */
40 int boardWidth,boardHeight,old,new;
42 nw=GTK_WIDGET(object)->allocation.width;
43 nh=GTK_WIDGET(object)->allocation.height;
46 squareSize = nw/(BOARD_WIDTH*1.05+0.05);
50 lineGap = squareSize*0.05;
52 boardWidth = lineGap + BOARD_WIDTH * (squareSize + lineGap);
53 boardHeight = lineGap + BOARD_HEIGHT * (squareSize + lineGap);
55 /* get the height of the menus, etc. and calculate the aspect ratio */
56 gtk_widget_size_request(GTK_WIDGET(GUI_Menubar), &w);
58 gtk_widget_size_request(GTK_WIDGET(GUI_Timer), &w);
60 gtk_widget_size_request(GTK_WIDGET(GUI_Buttonbar), &w);
63 ratio = ((float)totalh+boardHeight)/((float)boardWidth) ;
65 gtk_widget_set_size_request(GTK_WIDGET(GUI_Board),
66 boardWidth,boardHeight);
68 gtk_aspect_frame_set (GTK_ASPECT_FRAME(GUI_Aspect),0,0,ratio,TRUE);
70 /* recreate pieces with new size... TODO: keep svg in memory and just recreate pixmap instead of reloading files */
73 return FALSE; /* return false, so that other expose events are called too */
77 QuitProc (object, user_data)
86 void InfoProc(object, user_data)
91 snprintf(buf, sizeof(buf), "xterm -e info --directory %s --directory . -f %s &",
97 void ManProc(object, user_data)
102 snprintf(buf, sizeof(buf), "xterm -e man xboard &");
107 void HintProc(object, user_data)
115 void BookProc(object, user_data)
123 void AboutProc (object, user_data)
129 const gchar *authors[] = {"Tim Mann <tim@tim-mann.org>",
131 "Evan Welsh <Evan.Welsh@msdw.com>",
132 "Elmar Bartel <bartel@informatik.tu-muenchen.de>",
135 "Hugh Fisher <Hugh.Fisher@cs.anu.edu.au>",
136 "Allessandro Scotti",
137 "H.G. Muller <h.g.muller AT hccnet DOT nl>",
138 "Eric Mullins <emwine AT earthlink DOT net>",
139 "Arun Persaud <arun@nubati.net>"};
141 /* set up about window */
142 about = GTK_WIDGET(gtk_about_dialog_new());
144 /* fill in some information */
147 char *zippy = " (with Zippy code)";
151 sprintf(buf, "%s%s", programVersion, zippy);
153 gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about),buf);
155 gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about),
156 "Copyright 1991 Digital Equipment Corporation\n"
157 "Enhancements Copyright 1992-2009 Free Software Foundation\n"
158 "Enhancements Copyright 2005 Alessandro Scotti");
159 gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(about),"http://www.gnu.org/software/xboard/");
160 gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(about),authors);
161 gtk_about_dialog_set_translator_credits(GTK_ABOUT_DIALOG(about),
162 " A. Alper (turkish)\n"
163 " A. Persaud (german)\n");
165 /* end set up about window */
166 gtk_dialog_run(GTK_DIALOG (about));
167 gtk_widget_destroy(about);
172 void IcsClientProc(object, user_data)
184 void LoadNextGameProc(object, user_data)
192 void LoadPrevGameProc(object, user_data)
200 void ReloadGameProc(object, user_data)
209 void LoadNextPositionProc(object, user_data)
217 void LoadPrevPositionProc(object, user_data)
225 void ReloadPositionProc(object, user_data)
236 void MachineWhiteProc(object, user_data)
244 void MachineBlackProc(object, user_data)
252 void TwoMachinesProc(object, user_data)
260 void AcceptProc(object, user_data)
268 void DeclineProc(object, user_data)
276 void RematchProc(object, user_data)
284 void CallFlagProc(object, user_data)
292 void DrawProc(object, user_data)
300 void AbortProc(object, user_data)
308 void AdjournProc(object, user_data)
316 void ResignProc(object, user_data)
324 void StopObservingProc(object, user_data)
328 StopObservingEvent();
332 void StopExaminingProc(object, user_data)
336 StopExaminingEvent();
340 void AdjuWhiteProc(object, user_data)
344 UserAdjudicationEvent(+1);
348 void AdjuBlackProc(object, user_data)
352 UserAdjudicationEvent(-1);
356 void AdjuDrawProc(object, user_data)
360 UserAdjudicationEvent(0);
364 void BackwardProc(object, user_data)
372 void ForwardProc(object, user_data)
380 void ToStartProc(object, user_data)
388 void ToEndProc(object, user_data)
396 void RevertProc(object, user_data)
404 void TruncateGameProc(object, user_data)
412 void MoveNowProc(object, user_data)
420 void RetractMoveProc(object, user_data)
429 void AutocommProc(object, user_data)
433 appData.autoComment = !appData.autoComment;
437 void AutoflagProc(object, user_data)
441 appData.autoCallFlag = !appData.autoCallFlag;
445 void AutoflipProc(object, user_data)
449 appData.autoFlipView = !appData.autoFlipView;
453 void ShowThinkingProc(object, user_data)
457 appData.showThinking = !appData.showThinking;
463 void HideThinkingProc(object, user_data)
467 appData.hideThinkingFromHuman = !appData.hideThinkingFromHuman;
473 void FlipViewProc(object, user_data)
477 flipView = !flipView;
478 DrawPosition(True, NULL);
483 gboolean CloseWindowProc(GtkWidget *button)
485 gtk_widget_destroy(gtk_widget_get_toplevel(button));
490 ResetProc (object, user_data)
495 EngineOutputPopDown();
498 void WhiteClockProc(object, user_data)
502 if (gameMode == EditPosition || gameMode == IcsExamining) {
503 SetWhiteToPlayEvent();
504 } else if (gameMode == IcsPlayingBlack || gameMode == MachinePlaysWhite) {
509 void BlackClockProc(object, user_data)
513 if (gameMode == EditPosition || gameMode == IcsExamining) {
514 SetBlackToPlayEvent();
515 } else if (gameMode == IcsPlayingWhite || gameMode == MachinePlaysBlack) {
521 void ShowCoordsProc(object, user_data)
525 appData.showCoords = !appData.showCoords;
527 DrawPosition(True, NULL);
530 void ErrorPopDownProc(object, user_data)
534 gtk_widget_destroy(GTK_WIDGET(object));
538 void PauseProc(object, user_data)
542 // todo this toggling of the pause button doesn't seem to work?
543 // e.g. select pause from buttonbar doesn't activate menumode.pause
548 void LoadGameProc(object, user_data)
553 dialog = gtk_file_chooser_dialog_new (_("Load game file name?"),
554 GTK_WINDOW(GUI_Window),
555 GTK_FILE_CHOOSER_ACTION_OPEN,
556 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
557 GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
559 if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
564 filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
567 f = fopen(filename, "rb");
570 DisplayError(_("Failed to open file"), errno);
575 (void) LoadGamePopUp(f, 0, filename);
580 gtk_widget_destroy (dialog);
591 void EventProc(window, event, data)
596 /* todo do we still need this?
597 if (!XtIsRealized(widget))
601 switch (event->type) {
603 if (event->expose.count > 0) return; /* no clipping is done */
604 DrawPosition(True, NULL);
613 * event handler for parsing user moves
615 void UserMoveProc(window, event, data)
622 static int second = 0;
624 if (errorExitStatus != -1) return;
626 if (event->type == GDK_BUTTON_PRESS) ErrorPopDown();
630 if (event->type == GDK_BUTTON_PRESS)
632 /* todo add promotionshellwidget
633 XtPopdown(promotionShell);
634 XtDestroyWidget(promotionShell); */
645 x = EventToSquare( (int)event->button.x, BOARD_WIDTH );
646 y = EventToSquare( (int)event->button.y, BOARD_HEIGHT );
647 if (!flipView && y >= 0)
649 y = BOARD_HEIGHT - 1 - y;
651 if (flipView && x >= 0)
653 x = BOARD_WIDTH - 1 - x;
658 if (event->type == ButtonPress)
661 if (OKToStartUserMove(x, y))
666 DragPieceBegin(event->button.x, event->button.y);
667 if (appData.highlightDragging)
669 SetHighlights(x, y, -1, -1);
677 if (event->type == GDK_BUTTON_PRESS && gameMode != EditPosition &&
681 /* Check if clicking again on the same color piece */
682 fromP = boards[currentMove][fromY][fromX];
683 toP = boards[currentMove][y][x];
684 if ((WhitePawn <= fromP && fromP <= WhiteKing &&
685 WhitePawn <= toP && toP <= WhiteKing) ||
686 (BlackPawn <= fromP && fromP <= BlackKing &&
687 BlackPawn <= toP && toP <= BlackKing)) {
688 /* Clicked again on same color piece -- changed his mind */
689 second = (x == fromX && y == fromY);
690 if (appData.highlightDragging) {
691 SetHighlights(x, y, -1, -1);
695 if (OKToStartUserMove(x, y)) {
698 DragPieceBegin(event->button.x, event->button.y);
704 if (event->type == GDK_BUTTON_RELEASE && x == fromX && y == fromY)
706 DragPieceEnd(event->button.x, event->button.y);
707 if (appData.animateDragging)
709 /* Undo animation damage if any */
710 DrawPosition(FALSE, NULL);
714 /* Second up/down in same square; just abort move */
719 ClearPremoveHighlights();
723 /* First upclick in same square; start click-click mode */
724 SetHighlights(x, y, -1, -1);
732 saveAnimate = appData.animate;
734 if (event->type == GDK_BUTTON_PRESS)
736 /* Finish clickclick move */
737 if (appData.animate || appData.highlightLastMove)
739 SetHighlights(fromX, fromY, toX, toY);
748 /* Finish drag move */
749 if (appData.highlightLastMove)
751 SetHighlights(fromX, fromY, toX, toY);
757 DragPieceEnd(event->button.x, event->button.y);
758 /* Don't animate move and drag both */
759 appData.animate = FALSE;
762 if (IsPromotion(fromX, fromY, toX, toY))
764 if (appData.alwaysPromoteToQueen)
766 UserMoveEvent(fromX, fromY, toX, toY, 'q');
767 if (!appData.highlightLastMove || gotPremove) ClearHighlights();
768 if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY);
773 SetHighlights(fromX, fromY, toX, toY);
779 UserMoveEvent(fromX, fromY, toX, toY, NULLCHAR);
781 if (!appData.highlightLastMove || gotPremove) ClearHighlights();
782 if (gotPremove) SetPremoveHighlights(fromX, fromY, toX, toY);
786 appData.animate = saveAnimate;
787 if (appData.animate || appData.animateDragging) {
788 /* Undo animation damage if needed */
789 DrawPosition(FALSE, NULL);
795 void GetMoveListProc(object, user_data)
799 appData.getMoveList = !appData.getMoveList;
801 if (appData.getMoveList)
806 // gets set automatically? if we set it with set_active we end up in an endless loop switching between 0 and 1
807 // gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (object),(gboolean) appData.getMoveList );