Append recent engines to engine menu
[xboard.git] / xboard.c
index 4f3066e..845c168 100644 (file)
--- a/xboard.c
+++ b/xboard.c
@@ -63,6 +63,7 @@
 #include <math.h>
 #include <cairo/cairo.h>
 #include <cairo/cairo-xlib.h>
+#include <gtk/gtk.h>
 
 #if !OMIT_SOCKETS
 # if HAVE_SYS_SOCKET_H
@@ -183,27 +184,15 @@ extern char *getenv();
 // [HGM] bitmaps: put before incuding the bitmaps / pixmaps, to know how many piece types there are.
 #include "common.h"
 
-#if HAVE_LIBXPM
-#include <X11/xpm.h>
-#define IMAGE_EXT "xpm"
-#else
-#define IMAGE_EXT "xim"
-#endif
-
-#include "bitmaps/icon_white.bm"
-#include "bitmaps/icon_black.bm"
-#include "bitmaps/checkmark.bm"
-
 #include "frontend.h"
 #include "backend.h"
 #include "backendz.h"
 #include "moves.h"
 #include "xboard.h"
+#include "xboard2.h"
 #include "childio.h"
 #include "xgamelist.h"
 #include "xhistory.h"
-#include "xevalgraph.h"
-#include "xedittags.h"
 #include "menus.h"
 #include "board.h"
 #include "dialogs.h"
@@ -239,8 +228,6 @@ XFontSet CreateFontSet P((char *base_fnt_lst));
 #else
 char *FindFont P((char *pattern, int targetPxlSize));
 #endif
-void ReadBitmap P((Pixmap *pm, String name, unsigned char bits[],
-                  u_int wreq, u_int hreq));
 void EventProc P((Widget widget, caddr_t unused, XEvent *event));
 void DelayedDrag P((void));
 static void MoveTypeInProc P((Widget widget, caddr_t unused, XEvent *event));
@@ -272,15 +259,13 @@ int CopyMemoProc P(());
 */
 int xtVersion = XtSpecificationRelease;
 
+#ifdef TODO_GTK
 int xScreen;
 Display *xDisplay;
 Window xBoardWindow;
-Pixel lightSquareColor, darkSquareColor, whitePieceColor, blackPieceColor,
-  highlightSquareColor, premoveHighlightColor;       // used in graphics
 Pixel lowTimeWarningColor, dialogColor, buttonColor; // used in widgets
 Pixmap iconPixmap, wIconPixmap, bIconPixmap, xMarkPixmap;
 Widget shellWidget, formWidget, boardWidget, titleWidget, dropMenu, menuBarWidget;
-Option *optList; // contains all widgets of main window
 #if ENABLE_NLS
 XFontSet fontSet, clockFontSet;
 #else
@@ -290,6 +275,12 @@ XFontStruct *clockFontStruct;
 Font coordFontID, countFontID;
 XFontStruct *coordFontStruct, *countFontStruct;
 XtAppContext appContext;
+#else
+void *shellWidget, *formWidget, *boardWidget, *titleWidget, *dropMenu, *menuBarWidget;
+void *appContext;
+GtkWidget       *mainwindow;
+#endif
+Option *optList; // contains all widgets of main window
 char *layoutName;
 
 char installDir[] = "."; // [HGM] UCI: needed for UCI; probably needs run-time initializtion
@@ -324,7 +315,6 @@ WindowPlacement wpEngineOutput;
 WindowPlacement wpGameList;
 WindowPlacement wpTags;
 
-
 /* This magic number is the number of intermediate frames used
    in each half of the animation. For short moves it's reduced
    by 1. The total number of frames will be factor * 2 + 1.  */
@@ -345,6 +335,7 @@ DropMenuEnables dmEnables[] = {
     { 'Q', "Queen" }
 };
 
+#ifdef TODO_GTK
 Arg shellArgs[] = {
     { XtNwidth, 0 },
     { XtNheight, 0 },
@@ -390,6 +381,7 @@ XtActionsRec boardActions[] = {
     { "WheelProc", WheelProc },
     { "TabProc", TabProc },
 };
+#endif
 
 char globalTranslations[] =
   ":<Key>F9: MenuItem(Actions.Resign) \n \
@@ -470,11 +462,12 @@ char ICSInputTranslations[] =
 //             as the widget is destroyed before the up-click can call extend-end
 char commentTranslations[] = "<Btn3Down>: extend-end() select-start() CommentClick() \n";
 
+#ifdef TODO_GTK
 String xboardResources[] = {
     "*Error*translations: #override\\n <Key>Return: ErrorPopDown()",
     NULL
   };
-
+#endif
 
 /* Max possible square size */
 #define MAXSQSIZE 256
@@ -601,6 +594,7 @@ Warning: No DIR structure found on this system --\n\
 #endif /* HAVE_DIR_STRUCT */
 
 
+#ifdef TODO_GTK
 /* Arrange to catch delete-window events */
 Atom wm_delete_window;
 void
@@ -611,15 +605,12 @@ CatchDeleteWindow (Widget w, String procname)
   snprintf(buf, sizeof(buf), "<Message>WM_PROTOCOLS: %s() \n", procname);
   XtAugmentTranslations(w, XtParseTranslationTable(buf));
 }
+#endif
 
 void
 BoardToTop ()
 {
-  Arg args[16];
-  XtSetArg(args[0], XtNiconic, False);
-  XtSetValues(shellWidget, args, 1);
-
-  XtPopup(shellWidget, XtGrabNone); /* Raise if lowered  */
+  gtk_window_present(GTK_WINDOW(mainwindow));
 }
 
 //---------------------------------------------------------------------------------------------------------
@@ -797,6 +788,7 @@ ParseCommPortSettings (char *s)
 
 int frameX, frameY;
 
+#ifdef TODO_GTK
 void
 GetActualPlacement (Widget wg, WindowPlacement *wp)
 {
@@ -815,11 +807,13 @@ GetActualPlacement (Widget wg, WindowPlacement *wp)
   wp->width = winAt.width;
   frameX = winAt.x; frameY = winAt.y; // remember to decide if windows touch
 }
+#endif
 
 void
 GetWindowCoords ()
 { // wrapper to shield use of window handles from back-end (make addressible by number?)
   // In XBoard this will have to wait until awareness of window parameters is implemented
+#ifdef TODO_GTK
   GetActualPlacement(shellWidget, &wpMain);
   if(shellUp[EngOutDlg]) GetActualPlacement(shells[EngOutDlg], &wpEngineOutput);
   if(shellUp[HistoryDlg]) GetActualPlacement(shells[HistoryDlg], &wpMoveHistory);
@@ -827,6 +821,7 @@ GetWindowCoords ()
   if(shellUp[GameListDlg]) GetActualPlacement(shells[GameListDlg], &wpGameList);
   if(shellUp[CommentDlg]) GetActualPlacement(shells[CommentDlg], &wpComment);
   if(shellUp[TagsDlg]) GetActualPlacement(shells[TagsDlg], &wpTags);
+#endif
 }
 
 void
@@ -843,7 +838,11 @@ EnsureOnScreen (int *x, int *y, int minX, int minY)
 int
 MainWindowUp ()
 { // [HGM] args: allows testing if main window is realized from back-end
+#ifdef TODO_GTK
   return xBoardWindow != 0;
+#else
+  return 0;
+#endif
 }
 
 void
@@ -877,6 +876,7 @@ ConvertToLine (int argc, char **argv)
 void
 ResizeBoardWindow (int w, int h, int inhibit)
 {
+#ifdef TODO_GTK
     w += marginW + 1; // [HGM] not sure why the +1 is (sometimes) needed...
     h += marginH;
     shellArgs[0].value = w;
@@ -886,8 +886,10 @@ ResizeBoardWindow (int w, int h, int inhibit)
     XtSetValues(shellWidget, &shellArgs[0], inhibit ? 6 : 2);
 
     XSync(xDisplay, False);
+#endif
 }
 
+#ifdef TODO_GTK
 static int
 MakeOneColor (char *name, Pixel *color)
 {
@@ -905,22 +907,19 @@ MakeOneColor (char *name, Pixel *color)
     }
     return False;
 }
+#endif
 
 int
 MakeColors ()
 {   // [HGM] taken out of main(), so it can be called from BoardOptions dialog
     int forceMono = False;
 
-    forceMono |= MakeOneColor(appData.lightSquareColor, &lightSquareColor);
-    forceMono |= MakeOneColor(appData.darkSquareColor, &darkSquareColor);
-    forceMono |= MakeOneColor(appData.whitePieceColor, &whitePieceColor);
-    forceMono |= MakeOneColor(appData.blackPieceColor, &blackPieceColor);
-    forceMono |= MakeOneColor(appData.highlightSquareColor, &highlightSquareColor);
-    forceMono |= MakeOneColor(appData.premoveHighlightColor, &premoveHighlightColor);
+#ifdef TODO_GTK
     if (appData.lowTimeWarning)
        forceMono |= MakeOneColor(appData.lowTimeWarningColor, &lowTimeWarningColor);
     if(appData.dialogColor[0]) MakeOneColor(appData.dialogColor, &dialogColor);
     if(appData.buttonColor[0]) MakeOneColor(appData.buttonColor, &buttonColor);
+#endif
 
     return forceMono;
 }
@@ -928,6 +927,7 @@ MakeColors ()
 void
 InitializeFonts (int clockFontPxlSize, int coordFontPxlSize, int fontPxlSize)
 {   // detervtomine what fonts to use, and create them
+#ifdef TODO_GTK
     XrmValue vTo;
     XrmDatabase xdb;
 
@@ -978,6 +978,7 @@ InitializeFonts (int clockFontPxlSize, int coordFontPxlSize, int fontPxlSize)
 #else
     XrmPutStringResource(&xdb, "*font", appData.font);
 #endif
+#endif
 }
 
 char *
@@ -1041,11 +1042,15 @@ int
 main (int argc, char **argv)
 {
     int i, clockFontPxlSize, coordFontPxlSize, fontPxlSize;
+#ifdef TODO_GTK
     XSetWindowAttributes window_attributes;
     Arg args[16];
+#else
+#endif
     Dimension boardWidth, boardHeight, w, h;
     char *p;
     int forceMono = False;
+    GError *gtkerror=NULL;
 
     srandom(time(0)); // [HGM] book: make random truly random
 
@@ -1063,6 +1068,9 @@ main (int argc, char **argv)
        exit(0);
     }
 
+    /* set up GTK */
+    gtk_init (&argc, &argv);
+
     programName = strrchr(argv[0], '/');
     if (programName == NULL)
       programName = argv[0];
@@ -1070,10 +1078,9 @@ main (int argc, char **argv)
       programName++;
 
 #ifdef ENABLE_NLS
-    XtSetLanguageProc(NULL, NULL, NULL);
-    if (appData.debugMode) {
-      fprintf(debugFP, "locale = %s\n", setlocale(LC_ALL, NULL));
-    }
+//    if (appData.debugMode) {
+//      fprintf(debugFP, "locale = %s\n", setlocale(LC_ALL, NULL));
+//    }
 
     bindtextdomain(PACKAGE, LOCALEDIR);
     textdomain(PACKAGE);
@@ -1120,6 +1127,12 @@ main (int argc, char **argv)
         setbuf(debugFP, NULL);
     }
 
+#if ENABLE_NLS
+    if (appData.debugMode) {
+      fprintf(debugFP, "locale = %s\n", setlocale(LC_ALL, NULL));
+    }
+#endif
+
     /* [HGM,HR] make sure board size is acceptable */
     if(appData.NrFiles > BOARD_FILES ||
        appData.NrRanks > BOARD_RANKS   )
@@ -1134,6 +1147,17 @@ main (int argc, char **argv)
        gameInfo.variant = StringToVariant(appData.variant);
        InitPosition(FALSE);
 
+#ifdef TODO_GTK
+    /* GTK */
+    builder = gtk_builder_new();
+    filename = get_glade_filename ("mainboard.glade");
+    if(! gtk_builder_add_from_file (builder, filename, &gtkerror) )
+      {
+      if(gtkerror)
+        printf ("Error: %d %s\n",gtkerror->code,gtkerror->message);
+      }
+    mainwindow = GTK_WIDGET(gtk_builder_get_object (builder, "mainwindow"));
+
     shellWidget =
       XtAppInitialize(&appContext, "XBoard", shellOptions,
                      XtNumber(shellOptions),
@@ -1146,6 +1170,7 @@ main (int argc, char **argv)
     xDisplay = XtDisplay(shellWidget);
     xScreen = DefaultScreen(xDisplay);
     wm_delete_window = XInternAtom(xDisplay, "WM_DELETE_WINDOW", True);
+#endif
 
     /*
      * determine size, based on supplied or remembered -size, or screen size
@@ -1182,10 +1207,20 @@ main (int argc, char **argv)
     } else {
         SizeDefaults *szd = sizeDefaults;
         if (*appData.boardSize == NULLCHAR) {
+#ifdef TODO_GTK
            while (DisplayWidth(xDisplay, xScreen) < szd->minScreenSize ||
                   DisplayHeight(xDisplay, xScreen) < szd->minScreenSize) {
              szd++;
            }
+#else
+            GdkScreen *screen = gtk_window_get_screen(GTK_WINDOW(mainwindow));
+            guint screenwidth = gdk_screen_get_width(screen);
+            guint screenheight = gdk_screen_get_height(screen);
+           while (screenwidth < szd->minScreenSize ||
+                  screenheight < szd->minScreenSize) {
+             szd++;
+           }
+#endif
            if (szd->name == NULL) szd--;
            appData.boardSize = strdup(szd->name); // [HGM] settings: remember name for saving settings
        } else {
@@ -1207,24 +1242,6 @@ main (int argc, char **argv)
        // [HGM] font: use defaults from settings file if available and not overruled
     }
 
-    /* Now, using squareSize as a hint, find a good XPM/XIM set size */
-    if (strlen(appData.pixmapDirectory) > 0) {
-       p = ExpandPathName(appData.pixmapDirectory);
-       if (!p) {
-           fprintf(stderr, _("Error expanding path name \"%s\"\n"),
-                  appData.pixmapDirectory);
-           exit(1);
-       }
-       if (appData.debugMode) {
-          fprintf(stderr, _("\
-XBoard square size (hint): %d\n\
-%s fulldir:%s:\n"), squareSize, IMAGE_EXT, p);
-       }
-       squareSize = xpm_closest_to(p, squareSize, IMAGE_EXT);
-       if (appData.debugMode) {
-           fprintf(stderr, _("Closest %s size: %d\n"), IMAGE_EXT, squareSize);
-       }
-    }
     defaultLineGap = lineGap;
     if(appData.overrideLineGap >= 0) lineGap = appData.overrideLineGap;
 
@@ -1235,14 +1252,18 @@ XBoard square size (hint): %d\n\
     /*
      * Determine what fonts to use.
      */
+#ifdef TODO_GTK
     InitializeFonts(clockFontPxlSize, coordFontPxlSize, fontPxlSize);
+#endif
 
     /*
      * Detect if there are not enough colors available and adapt.
      */
+#ifdef TODO_GTK
     if (DefaultDepth(xDisplay, xScreen) <= 2) {
       appData.monoMode = True;
     }
+#endif
 
     forceMono = MakeColors();
 
@@ -1253,14 +1274,18 @@ XBoard square size (hint): %d\n\
     }
 
     if (appData.monoMode && appData.debugMode) {
+#ifdef TODO_GTK
        fprintf(stderr, _("white pixel = 0x%lx, black pixel = 0x%lx\n"),
                (unsigned long) XWhitePixel(xDisplay, xScreen),
                (unsigned long) XBlackPixel(xDisplay, xScreen));
+#endif
     }
 
     ParseIcsTextColors();
 
+#ifdef TODO_GTK
     XtAppAddActions(appContext, boardActions, XtNumber(boardActions));
+#endif
 
     /*
      * widget hierarchy
@@ -1274,15 +1299,22 @@ XBoard square size (hint): %d\n\
     }
 
     optList = BoardPopUp(squareSize, lineGap, (void*)
+#ifdef TODO_GTK
 #if ENABLE_NLS
                                                &clockFontSet);
 #else
                                                clockFontStruct);
 #endif
+#else
+0);
+#endif
+    InitDrawingHandle(optList + W_BOARD);
+    currBoard        = &optList[W_BOARD];
     boardWidget      = optList[W_BOARD].handle;
     menuBarWidget    = optList[W_MENU].handle;
     dropMenu         = optList[W_DROP].handle;
     titleWidget = optList[optList[W_TITLE].type != -1 ? W_TITLE : W_SMALL].handle;
+#ifdef TODO_GTK
     formWidget  = XtParent(boardWidget);
     XtSetArg(args[0], XtNbackground, &timerBackgroundPixel);
     XtSetArg(args[1], XtNforeground, &timerForegroundPixel);
@@ -1292,23 +1324,21 @@ XBoard square size (hint): %d\n\
       XtSetArg(args[1], XtNforeground, &buttonForegroundPixel);
       XtGetValues(optList[W_PAUSE].handle, args, 2);
     }
-    AppendEnginesToMenu(appData.recentEngineList);
+#endif
 
+#ifdef TODO_GTK
     xBoardWindow = XtWindow(boardWidget);
+#endif
 
     // [HGM] it seems the layout code ends here, but perhaps the color stuff is size independent and would
     //       not need to go into InitDrawingSizes().
 
-    /*
-     * Create X checkmark bitmap and initialize option menu checks.
-     */
-    ReadBitmap(&xMarkPixmap, "checkmark.bm",
-              checkmark_bits, checkmark_width, checkmark_height);
     InitMenuMarkers();
 
     /*
      * Create an icon.
      */
+#ifdef TODO_GTK
     ReadBitmap(&wIconPixmap, "icon_white.bm",
               icon_white_bits, icon_white_width, icon_white_height);
     ReadBitmap(&bIconPixmap, "icon_black.bm",
@@ -1317,29 +1347,36 @@ XBoard square size (hint): %d\n\
     i = 0;
     XtSetArg(args[i], XtNiconPixmap, iconPixmap);  i++;
     XtSetValues(shellWidget, args, i);
+#endif
 
     /*
      * Create a cursor for the board widget.
      */
+#ifdef TODO_GTK
     window_attributes.cursor = XCreateFontCursor(xDisplay, XC_hand2);
     XChangeWindowAttributes(xDisplay, xBoardWindow,
                            CWCursor, &window_attributes);
+#endif
 
     /*
      * Inhibit shell resizing.
      */
+#ifdef TODO_GTK
     shellArgs[0].value = (XtArgVal) &w;
     shellArgs[1].value = (XtArgVal) &h;
     XtGetValues(shellWidget, shellArgs, 2);
     shellArgs[4].value = shellArgs[2].value = w;
     shellArgs[5].value = shellArgs[3].value = h;
-    if(!CreateAnyPieces()) XtSetValues(shellWidget, &shellArgs[2], 4);
+//    XtSetValues(shellWidget, &shellArgs[2], 4);
+#endif
     marginW =  w - boardWidth; // [HGM] needed to set new shellWidget size when we resize board
     marginH =  h - boardHeight;
 
+#ifdef TODO_GTK
     CatchDeleteWindow(shellWidget, "QuitProc");
+#endif
 
-    CreateGCs(False);
+    CreateAnyPieces();
     CreateGrid();
 
     if(appData.logoSize)
@@ -1352,6 +1389,7 @@ XBoard square size (hint): %d\n\
     if (appData.animate || appData.animateDragging)
       CreateAnimVars();
 
+#ifdef TODO_GTK
     XtAugmentTranslations(formWidget,
                          XtParseTranslationTable(globalTranslations));
 
@@ -1359,6 +1397,7 @@ XBoard square size (hint): %d\n\
                      (XtEventHandler) MoveTypeInProc, NULL);
     XtAddEventHandler(shellWidget, StructureNotifyMask, False,
                      (XtEventHandler) EventProc, NULL);
+#endif
 
     /* [AS] Restore layout */
     if( wpMoveHistory.visible ) {
@@ -1398,9 +1437,16 @@ XBoard square size (hint): %d\n\
     InitPosition(TRUE);
     UpdateLogos(TRUE);
 //    XtSetKeyboardFocus(shellWidget, formWidget);
+#ifdef TODO_GTK
     XSetInputFocus(xDisplay, XtWindow(formWidget), RevertToPointerRoot, CurrentTime);
+#endif
+
+    /* check for GTK events and process them */
+//    gtk_main();
+while(1) {
+gtk_main_iteration();
+}
 
-    XtAppMainLoop(appContext);
     if (appData.debugMode) fclose(debugFP); // [DM] debug
     return 0;
 }
@@ -1494,6 +1540,7 @@ InsertPxlSize (char *pattern, int targetPxlSize)
     return base_fnt_lst;
 }
 
+#ifdef TODO_GTK
 XFontSet
 CreateFontSet (char *base_fnt_lst)
 {
@@ -1528,6 +1575,7 @@ CreateFontSet (char *base_fnt_lst)
     }
     return fntSet;
 }
+#endif
 #else // not ENABLE_NLS
 /*
  * Find a font that matches "pattern" that is as close as
@@ -1544,6 +1592,7 @@ FindFont (char *pattern, int targetPxlSize)
     char **fonts, *p, *best, *scalable, *scalableTail;
     int i, j, nfonts, minerr, err, pxlSize;
 
+#ifdef TODO_GTK
     fonts = XListFonts(xDisplay, pattern, 999999, &nfonts);
     if (nfonts < 1) {
        fprintf(stderr, _("%s: no fonts match pattern %s\n"),
@@ -1592,82 +1641,25 @@ FindFont (char *pattern, int targetPxlSize)
                pattern, targetPxlSize, p);
     }
     XFreeFontNames(fonts);
+#endif
     return p;
 }
 #endif
 
 void
-ReadBitmap (Pixmap *pm, String name, unsigned char bits[], u_int wreq, u_int hreq)
-{
-    int x_hot, y_hot;
-    u_int w, h;
-    int errcode;
-    char msg[MSG_SIZ], fullname[MSG_SIZ];
-
-    if (*appData.bitmapDirectory != NULLCHAR) {
-      safeStrCpy(fullname, appData.bitmapDirectory, sizeof(fullname)/sizeof(fullname[0]) );
-      strncat(fullname, "/", MSG_SIZ - strlen(fullname) - 1);
-      strncat(fullname, name, MSG_SIZ - strlen(fullname) - 1);
-      errcode = XReadBitmapFile(xDisplay, xBoardWindow, fullname,
-                               &w, &h, pm, &x_hot, &y_hot);
-      fprintf(stderr, "load %s\n", name);
-       if (errcode != BitmapSuccess) {
-           switch (errcode) {
-             case BitmapOpenFailed:
-               snprintf(msg, sizeof(msg), _("Can't open bitmap file %s"), fullname);
-               break;
-             case BitmapFileInvalid:
-               snprintf(msg, sizeof(msg), _("Invalid bitmap in file %s"), fullname);
-               break;
-             case BitmapNoMemory:
-               snprintf(msg, sizeof(msg), _("Ran out of memory reading bitmap file %s"),
-                       fullname);
-               break;
-             default:
-               snprintf(msg, sizeof(msg), _("Unknown XReadBitmapFile error %d on file %s"),
-                       errcode, fullname);
-               break;
-           }
-           fprintf(stderr, _("%s: %s...using built-in\n"),
-                   programName, msg);
-       } else if (w != wreq || h != hreq) {
-           fprintf(stderr,
-                   _("%s: Bitmap %s is %dx%d, not %dx%d...using built-in\n"),
-                   programName, fullname, w, h, wreq, hreq);
-       } else {
-           return;
-       }
-    }
-    if (bits != NULL) {
-       *pm = XCreateBitmapFromData(xDisplay, xBoardWindow, (char *) bits,
-                                   wreq, hreq);
-    }
-}
-
-void
-MarkMenuItem (char *menuRef, int state)
-{
-    MenuItem *item = MenuNameToItem(menuRef);
-
-    if(item) {
-       Arg args[2];
-       XtSetArg(args[0], XtNleftBitmap, state ? xMarkPixmap : None);
-       XtSetValues(item->handle, args, 1);
-    }
-}
-
-void
 EnableNamedMenuItem (char *menuRef, int state)
 {
     MenuItem *item = MenuNameToItem(menuRef);
 
-    if(item) XtSetSensitive(item->handle, state);
+    if(item) gtk_widget_set_sensitive(item->handle, state);
 }
 
 void
 EnableButtonBar (int state)
 {
+#ifdef TODO_GTK
     XtSetSensitive(optList[W_BUTTON].handle, state);
+#endif
 }
 
 
@@ -1680,6 +1672,7 @@ SetMenuEnables (Enables *enab)
   }
 }
 
+#ifdef TODO_GTK
 void
 KeyBindingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {   // [HGM] new method of key binding: specify MenuItem(FlipView) in stead of FlipViewProc in translation string
@@ -1688,22 +1681,12 @@ KeyBindingProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     item = MenuNameToItem(prms[0]);
     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);
-}
+#endif
 
 void
 SetupDropMenu ()
 {
+#ifdef TODO_GTK
     int i, j, count;
     char label[32];
     Arg args[16];
@@ -1724,9 +1707,9 @@ SetupDropMenu ()
        XtSetArg(args[j], XtNlabel, label); j++;
        XtSetValues(entry, args, j);
     }
+#endif
 }
 
-
 static void
 do_flash_delay (unsigned long msec)
 {
@@ -1736,8 +1719,10 @@ do_flash_delay (unsigned long msec)
 void
 FlashDelay (int flash_delay)
 {
+#ifdef TODO_GTK
        XSync(xDisplay, False);
        if(flash_delay) do_flash_delay(flash_delay);
+#endif
 }
 
 double
@@ -1750,6 +1735,7 @@ Fraction (int x, int start, int stop)
 
 static WindowPlacement wpNew;
 
+#ifdef TODO_GTK
 void
 CoDrag (Widget sh, WindowPlacement *wp)
 {
@@ -1780,28 +1766,37 @@ CoDrag (Widget sh, WindowPlacement *wp)
     wp->y += wpNew.y - wpMain.y;
     if(touch == 1) wp->x += wpNew.width - wpMain.width; else
     if(touch == 3) wp->y += wpNew.height - wpMain.height;
+#ifdef TODO_GTK
     XtSetArg(args[j], XtNx, wp->x); j++;
     XtSetArg(args[j], XtNy, wp->y); j++;
     XtSetValues(sh, args, j);
+#endif
 }
 
 void
 ReSize (WindowPlacement *wp)
 {
-       int sqx, sqy;
+       int sqx, sqy, w, h;
        if(wp->width == wpMain.width && wp->height == wpMain.height) return; // not sized
        sqx = (wp->width  - lineGap - marginW) / BOARD_WIDTH - lineGap;
        sqy = (wp->height - lineGap - marginH) / BOARD_HEIGHT - lineGap;
        if(sqy < sqx) sqx = sqy;
        if(sqx != squareSize) {
            squareSize = sqx; // adopt new square size
-           NewSurfaces();
            CreatePNGPieces(); // make newly scaled pieces
            InitDrawingSizes(0, 0); // creates grid etc.
-       }
+       } else ResizeBoardWindow(BOARD_WIDTH * (squareSize + lineGap) + lineGap, BOARD_HEIGHT * (squareSize + lineGap) + lineGap, 0);
+       w = BOARD_WIDTH * (squareSize + lineGap) + lineGap;
+       h = BOARD_HEIGHT * (squareSize + lineGap) + lineGap;
+       if(optList[W_BOARD].max   > w) optList[W_BOARD].max = w;
+       if(optList[W_BOARD].value > h) optList[W_BOARD].value = h;
 }
 
+#ifdef TODO_GTK
 static XtIntervalId delayedDragID = 0;
+#else
+static int delayedDragID = 0;
+#endif
 
 void
 DragProc ()
@@ -1825,21 +1820,25 @@ DragProc ()
        delayedDragID = 0; // now drag executed, make sure next DelayedDrag will not cancel timer event (which could now be used by other)
        busy = 0;
 }
-
+#endif
 
 void
 DelayedDrag ()
 {
+#ifdef TODO_GTK
     if(delayedDragID) XtRemoveTimeOut(delayedDragID); // cancel pending
     delayedDragID =
-      XtAppAddTimeOut(appContext, 100, (XtTimerCallbackProc) DragProc, (XtPointer) 0); // and schedule new one 50 msec later
+      XtAppAddTimeOut(appContext, 200, (XtTimerCallbackProc) DragProc, (XtPointer) 0); // and schedule new one 50 msec later
+#endif
 }
 
 void
 EventProc (Widget widget, caddr_t unused, XEvent *event)
 {
+#ifdef TODO_GTK
     if(XtIsRealized(widget) && event->type == ConfigureNotify || appData.useStickyWindows)
        DelayedDrag(); // as long as events keep coming in faster than 50 msec, they destroy each other
+#endif
 }
 
 /*
@@ -1852,17 +1851,20 @@ DrawPositionProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 }
 
 
+#ifdef TODO_GTK
 void
 HandlePV (Widget w, XEvent * event, String * params, Cardinal * nParams)
 {   // [HGM] pv: walk PV
     MovePV(event->xmotion.x, event->xmotion.y, lineGap + BOARD_HEIGHT * (squareSize + lineGap));
 }
+#endif
 
 static int savedIndex;  /* gross that this is global */
 
 void
 CommentClick (Widget w, XEvent * event, String * params, Cardinal * nParams)
 {
+#ifdef TODO_GTK
        String val;
        XawTextPosition index, dummy;
        Arg arg;
@@ -1873,6 +1875,7 @@ CommentClick (Widget w, XEvent * event, String * params, Cardinal * nParams)
        ReplaceComment(savedIndex, val);
        if(savedIndex != currentMove) ToNrEvent(savedIndex);
        LoadVariation( index, val ); // [HGM] also does the actual moving to it, now
+#endif
 }
 
 void
@@ -1905,7 +1908,7 @@ FreezeUI ()
 {
   if (frozen) return;
   /* Grab by a widget that doesn't accept input */
-  XtAddGrab(optList[W_MESSG].handle, TRUE, FALSE);
+  gtk_grab_add(optList[W_MESSG].handle);
   frozen = 1;
 }
 
@@ -1914,17 +1917,18 @@ void
 ThawUI ()
 {
   if (!frozen) return;
-  XtRemoveGrab(optList[W_MESSG].handle);
+  gtk_grab_remove(optList[W_MESSG].handle);
   frozen = 0;
 }
 
 void
 ModeHighlight ()
 {
-    Arg args[16];
     static int oldPausing = FALSE;
     static GameMode oldmode = (GameMode) -1;
     char *wname;
+#ifdef TODO_GTK
+    Arg args[16];
 
     if (!boardWidget || !XtIsRealized(boardWidget)) return;
 
@@ -1948,6 +1952,7 @@ ModeHighlight ()
          XtSetValues(optList[W_PAUSE].handle, args, 2);
        }
     }
+#endif
 
     wname = ModeToWidgetName(oldmode);
     if (wname != NULL) {
@@ -1963,7 +1968,7 @@ ModeHighlight ()
     /* Maybe all the enables should be handled here, not just this one */
     EnableNamedMenuItem("Mode.Training", gameMode == Training || gameMode == PlayFromGameFile);
 
-    DisplayLogos(optList[W_WHITE-1].handle, optList[W_BLACK+1].handle);
+    DisplayLogos(&optList[W_WHITE-1], &optList[W_BLACK+1]);
 }
 
 
@@ -1971,6 +1976,7 @@ ModeHighlight ()
  * Button/menu procedures
  */
 
+#ifdef TODO_GTK
 /* this variable is shared between CopyPositionProc and SendPositionSelection */
 char *selected_fen_position=NULL;
 
@@ -2037,6 +2043,7 @@ SendPositionSelection (Widget w, Atom *selection, Atom *target,
     return False;
   }
 }
+#endif
 
 /* note: when called from menu all parameters are NULL, so no clue what the
  * Widget which was clicked on was, or what the click event was
@@ -2044,6 +2051,7 @@ SendPositionSelection (Widget w, Atom *selection, Atom *target,
 void
 CopySomething (char *src)
 {
+#ifdef TODO_GTK
     selected_fen_position = src;
     /*
      * Set both PRIMARY (the selection) and CLIPBOARD, since we don't
@@ -2060,8 +2068,10 @@ CopySomething (char *src)
                   SendPositionSelection,
                   NULL/* lose_ownership_proc */ ,
                   NULL/* transfer_done_proc */);
+#endif
 }
 
+#ifdef TODO_GTK
 /* function called when the data to Paste is ready */
 static void
 PastePositionCB (Widget w, XtPointer client_data, Atom *selection,
@@ -2073,12 +2083,14 @@ PastePositionCB (Widget w, XtPointer client_data, Atom *selection,
   EditPositionPasteFEN(fenstr);
   XtFree(value);
 }
+#endif
 
 /* called when Paste Position button is pressed,
  * all parameters will be NULL */
 void
 PastePositionProc ()
 {
+#ifdef TODO_GTK
     XtGetSelectionValue(menuBarWidget,
       appData.pasteSelection ? XA_PRIMARY: XA_CLIPBOARD(xDisplay), XA_STRING,
       /* (XtSelectionCallbackProc) */ PastePositionCB,
@@ -2090,8 +2102,10 @@ PastePositionProc ()
       CurrentTime
     );
     return;
+#endif
 }
 
+#ifdef TODO_GTK
 /* note: when called from menu all parameters are NULL, so no clue what the
  * Widget which was clicked on was, or what the click event was
  */
@@ -2114,12 +2128,14 @@ PasteGameCB (Widget w, XtPointer client_data, Atom *selection,
   XtFree(value);
   LoadGameFromFile(gamePasteFilename, 0, gamePasteFilename, TRUE);
 }
+#endif
 
 /* called when Paste Game button is pressed,
  * all parameters will be NULL */
 void
 PasteGameProc ()
 {
+#ifdef TODO_GTK
     XtGetSelectionValue(menuBarWidget,
       appData.pasteSelection ? XA_PRIMARY: XA_CLIPBOARD(xDisplay), XA_STRING,
       /* (XtSelectionCallbackProc) */ PasteGameCB,
@@ -2131,6 +2147,7 @@ PasteGameProc ()
       CurrentTime
     );
     return;
+#endif
 }
 
 
@@ -2143,29 +2160,34 @@ QuitWrapper (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 int
 ShiftKeys ()
 {   // bassic primitive for determining if modifier keys are pressed
+    int i,j,  k=0;
+#ifdef TODO_GTK
     long int codes[] = { XK_Meta_L, XK_Meta_R, XK_Control_L, XK_Control_R, XK_Shift_L, XK_Shift_R };
     char keys[32];
-    int i,j,  k=0;
     XQueryKeymap(xDisplay,keys);
     for(i=0; i<6; i++) {
        k <<= 1;
        j = XKeysymToKeycode(xDisplay, codes[i]);
        k += ( (keys[j>>3]&1<<(j&7)) != 0 );
     }
+#endif
     return k;
 }
 
 static void
 MoveTypeInProc (Widget widget, caddr_t unused, XEvent *event)
 {
+#ifdef TODO_GTK
     char buf[10];
     KeySym sym;
     int n = XLookupString(&(event->xkey), buf, 10, &sym, NULL);
     if ( n == 1 && *buf >= 32 // printable
         && !(ShiftKeys() & 0x3C) // no Alt, Ctrl
        ) BoxAutoPopUp (buf);
+#endif
 }
 
+#ifdef TODO_GTK
 static void
 UpKeyProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {   // [HGM] input: let up-arrow recall previous line from history
@@ -2184,6 +2206,7 @@ EnterKeyProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     IcsKey(0);
 }
 
+
 void
 TempBackwardProc (Widget w, XEvent *event, String *prms, Cardinal *nprms)
 {
@@ -2221,16 +2244,20 @@ ManInner (Widget w, XEvent *event, String *prms, Cardinal *nprms)
     snprintf(buf, sizeof(buf), "xterm -e man %s &", name);
     system(buf);
 }
+#endif
 
 void
 ManProc ()
 {   // called from menu
+#ifdef TODO_GTK
     ManInner(NULL, NULL, NULL, NULL);
+#endif
 }
 
 void
 SetWindowTitle (char *text, char *title, char *icon)
 {
+#ifdef TODO_GTK
     Arg args[16];
     int i;
     if (appData.titleInWindow) {
@@ -2243,6 +2270,11 @@ SetWindowTitle (char *text, char *title, char *icon)
     XtSetArg(args[i], XtNtitle, (XtArgVal) title);      i++;
     XtSetValues(shellWidget, args, i);
     XSync(xDisplay, False);
+#endif
+    if (appData.titleInWindow) {
+       SetWidgetLabel(titleWidget, text);
+    }
+    gtk_window_set_title (GTK_WINDOW(shells[BoardWindow]), title);
 }
 
 
@@ -2255,6 +2287,7 @@ NullXErrorCheck (Display *dpy, XErrorEvent *error_event)
 void
 DisplayIcsInteractionTitle (String message)
 {
+#ifdef TODO_GTK
   if (oldICSInteractionTitle == NULL) {
     /* Magic to find the old window title, adapted from vim */
     char *wina = getenv("WINDOWID");
@@ -2279,183 +2312,50 @@ DisplayIcsInteractionTitle (String message)
   }
   printf("\033]0;%s\007", message);
   fflush(stdout);
+#endif
 }
 
 
-XtIntervalId delayedEventTimerXID = 0;
-DelayedEventCallback delayedEventCallback = 0;
-
-void
-FireDelayedEvent ()
-{
-    delayedEventTimerXID = 0;
-    delayedEventCallback();
-}
-
-void
-ScheduleDelayedEvent (DelayedEventCallback cb, long millisec)
-{
-    if(delayedEventTimerXID && delayedEventCallback == cb)
-       // [HGM] alive: replace, rather than add or flush identical event
-       XtRemoveTimeOut(delayedEventTimerXID);
-    delayedEventCallback = cb;
-    delayedEventTimerXID =
-      XtAppAddTimeOut(appContext, millisec,
-                     (XtTimerCallbackProc) FireDelayedEvent, (XtPointer) 0);
-}
-
-DelayedEventCallback
-GetDelayedEvent ()
-{
-  if (delayedEventTimerXID) {
-    return delayedEventCallback;
-  } else {
-    return NULL;
-  }
-}
-
-void
-CancelDelayedEvent ()
-{
-  if (delayedEventTimerXID) {
-    XtRemoveTimeOut(delayedEventTimerXID);
-    delayedEventTimerXID = 0;
-  }
-}
-
-XtIntervalId loadGameTimerXID = 0;
-
-int
-LoadGameTimerRunning ()
-{
-    return loadGameTimerXID != 0;
-}
-
-int
-StopLoadGameTimer ()
-{
-    if (loadGameTimerXID != 0) {
-       XtRemoveTimeOut(loadGameTimerXID);
-       loadGameTimerXID = 0;
-       return TRUE;
-    } else {
-       return FALSE;
-    }
-}
-
-void
-LoadGameTimerCallback (XtPointer arg, XtIntervalId *id)
-{
-    loadGameTimerXID = 0;
-    AutoPlayGameLoop();
-}
-
-void
-StartLoadGameTimer (long millisec)
-{
-    loadGameTimerXID =
-      XtAppAddTimeOut(appContext, millisec,
-                     (XtTimerCallbackProc) LoadGameTimerCallback,
-                     (XtPointer) 0);
-}
-
-XtIntervalId analysisClockXID = 0;
-
-void
-AnalysisClockCallback (XtPointer arg, XtIntervalId *id)
-{
-    if (gameMode == AnalyzeMode || gameMode == AnalyzeFile
-         || appData.icsEngineAnalyze) { // [DM]
-       AnalysisPeriodicEvent(0);
-       StartAnalysisClock();
-    }
-}
-
 void
-StartAnalysisClock ()
-{
-    analysisClockXID =
-      XtAppAddTimeOut(appContext, 2000,
-                     (XtTimerCallbackProc) AnalysisClockCallback,
-                     (XtPointer) 0);
-}
-
-XtIntervalId clockTimerXID = 0;
-
-int
-ClockTimerRunning ()
+DisplayTimerLabel (Option *opt, char *color, long timer, int highlight)
 {
-    return clockTimerXID != 0;
-}
+    GtkWidget *w = (GtkWidget *) opt->handle;
+    char *markup;
+    char bgcolor[10];
+    char fgcolor[10];
 
-int
-StopClockTimer ()
-{
-    if (clockTimerXID != 0) {
-       XtRemoveTimeOut(clockTimerXID);
-       clockTimerXID = 0;
-       return TRUE;
+    if (highlight) {
+       strcpy(bgcolor, "black");
+        strcpy(fgcolor, "white");
     } else {
-       return FALSE;
+        strcpy(bgcolor, "white");
+        strcpy(fgcolor, "black");
     }
-}
-
-void
-ClockTimerCallback (XtPointer arg, XtIntervalId *id)
-{
-    clockTimerXID = 0;
-    DecrementClocks();
-}
-
-void
-StartClockTimer (long millisec)
-{
-    clockTimerXID =
-      XtAppAddTimeOut(appContext, millisec,
-                     (XtTimerCallbackProc) ClockTimerCallback,
-                     (XtPointer) 0);
-}
-
-void
-DisplayTimerLabel (Option *opt, char *color, long timer, int highlight)
-{
-    char buf[MSG_SIZ];
-    Arg args[16];
-    Widget w = (Widget) opt->handle;
-
-    /* check for low time warning */
-    Pixel foregroundOrWarningColor = timerForegroundPixel;
-
     if (timer > 0 &&
         appData.lowTimeWarning &&
-        (timer / 1000) < appData.icsAlarmTime)
-      foregroundOrWarningColor = lowTimeWarningColor;
-
-    if (appData.clockMode) {
-      snprintf(buf, MSG_SIZ, "%s:%s%s", color, appData.logoSize && !partnerUp ? "\n" : " ", TimeString(timer));
-      XtSetArg(args[0], XtNlabel, buf);
-    } else {
-      snprintf(buf, MSG_SIZ, "%s  ", color);
-      XtSetArg(args[0], XtNlabel, buf);
+        (timer / 1000) < appData.icsAlarmTime) {
+        strcpy(fgcolor, appData.lowTimeWarningColor);
     }
 
-    if (highlight) {
-
-       XtSetArg(args[1], XtNbackground, foregroundOrWarningColor);
-       XtSetArg(args[2], XtNforeground, timerBackgroundPixel);
+    if (appData.clockMode) {
+        markup = g_markup_printf_escaped("<span size=\"xx-large\" weight=\"heavy\" background=\"%s\" foreground=\"%s\">%s:%s%s</span>",
+                                        bgcolor, fgcolor, color, appData.logoSize && !partnerUp ? "\n" : " ", TimeString(timer));
     } else {
-       XtSetArg(args[1], XtNbackground, timerBackgroundPixel);
-       XtSetArg(args[2], XtNforeground, foregroundOrWarningColor);
+        markup = g_markup_printf_escaped("<span size=\"xx-large\" weight=\"heavy\" background=\"%s\" foreground=\"%s\">%s  </span>",
+                                        bgcolor, fgcolor, color);
     }
-
-    XtSetValues(w, args, 3);
+    gtk_label_set_markup(GTK_LABEL(w), markup);
+    g_free(markup);
 }
 
+#ifdef TODO_GTK
 static Pixmap *clockIcons[] = { &wIconPixmap, &bIconPixmap };
+#endif
 
 void
 SetClockIcon (int color)
 {
+#ifdef TODO_GTK
     Arg args[16];
     Pixmap pm = *clockIcons[color];
     if (iconPixmap != pm) {
@@ -2463,25 +2363,53 @@ SetClockIcon (int color)
        XtSetArg(args[0], XtNiconPixmap, iconPixmap);
        XtSetValues(shellWidget, args, 1);
     }
+#endif
 }
 
-void
-DoInputCallback (caddr_t closure, int *source, XtInputId *xid)
-{
-    InputSource *is = (InputSource *) closure;
+#define INPUT_SOURCE_BUF_SIZE 8192
+
+typedef struct {
+    CPKind kind;
+    int fd;
+    int lineByLine;
+    char *unused;
+    InputCallback func;
+    guint sid;
+    char buf[INPUT_SOURCE_BUF_SIZE];
+    VOIDSTAR closure;
+} InputSource;
+
+gboolean
+DoInputCallback(io, cond, data)
+     GIOChannel  *io;
+     GIOCondition cond;
+     gpointer    *data;
+{
+  /* read input from one of the input source (for example a chess program, ICS, etc).
+   * and call a function that will handle the input
+   */
+
     int count;
     int error;
     char *p, *q;
 
+    /* All information (callback function, file descriptor, etc) is
+     * saved in an InputSource structure
+     */
+    InputSource *is = (InputSource *) data;
+
     if (is->lineByLine) {
        count = read(is->fd, is->unused,
                     INPUT_SOURCE_BUF_SIZE - (is->unused - is->buf));
        if (count <= 0) {
            (is->func)(is, is->closure, is->buf, count, count ? errno : 0);
-           return;
+           return True;
        }
        is->unused += count;
        p = is->buf;
+       /* break input into lines and call the callback function on each
+        * line
+        */
        while (p < is->unused) {
            q = memchr(p, '\n', is->unused - p);
            if (q == NULL) break;
@@ -2489,12 +2417,16 @@ DoInputCallback (caddr_t closure, int *source, XtInputId *xid)
            (is->func)(is, is->closure, p, q - p, 0);
            p = q;
        }
+       /* remember not yet used part of the buffer */
        q = is->buf;
        while (p < is->unused) {
            *q++ = *p++;
        }
        is->unused = q;
     } else {
+      /* read maximum length of input buffer and send the whole buffer
+       * to the callback function
+       */
        count = read(is->fd, is->buf, INPUT_SOURCE_BUF_SIZE);
        if (count == -1)
          error = errno;
@@ -2502,12 +2434,17 @@ DoInputCallback (caddr_t closure, int *source, XtInputId *xid)
          error = 0;
        (is->func)(is, is->closure, is->buf, count, error);
     }
+    return True; // Must return true or the watch will be removed
 }
 
-InputSourceRef
-AddInputSource (ProcRef pr, int lineByLine, InputCallback func, VOIDSTAR closure)
+InputSourceRef AddInputSource(pr, lineByLine, func, closure)
+     ProcRef pr;
+     int lineByLine;
+     InputCallback func;
+     VOIDSTAR closure;
 {
     InputSource *is;
+    GIOChannel *channel;
     ChildProc *cp = (ChildProc *) pr;
 
     is = (InputSource *) calloc(1, sizeof(InputSource));
@@ -2520,26 +2457,32 @@ AddInputSource (ProcRef pr, int lineByLine, InputCallback func, VOIDSTAR closure
        is->kind = cp->kind;
        is->fd = cp->fdFrom;
     }
-    if (lineByLine) {
-       is->unused = is->buf;
-    }
+    if (lineByLine)
+      is->unused = is->buf;
+    else
+      is->unused = NULL;
+
+   /* GTK-TODO: will this work on windows?*/
+
+    channel = g_io_channel_unix_new(is->fd);
+    g_io_channel_set_close_on_unref (channel, TRUE);
+    is->sid = g_io_add_watch(channel, G_IO_IN,(GIOFunc) DoInputCallback, is);
 
-    is->xid = XtAppAddInput(appContext, is->fd,
-                           (XtPointer) (XtInputReadMask),
-                           (XtInputCallbackProc) DoInputCallback,
-                           (XtPointer) is);
     is->closure = closure;
     return (InputSourceRef) is;
 }
 
+
 void
-RemoveInputSource (InputSourceRef isr)
+RemoveInputSource(isr)
+     InputSourceRef isr;
 {
     InputSource *is = (InputSource *) isr;
 
-    if (is->xid == 0) return;
-    XtRemoveInput(is->xid);
-    is->xid = 0;
+    if (is->sid == 0) return;
+    g_source_remove(is->sid);
+    is->sid = 0;
+    return;
 }
 
 #ifndef HAVE_USLEEP
@@ -2557,6 +2500,7 @@ FrameAlarm (int sig)
 void
 FrameDelay (int time)
 {
+#ifdef TODO_GTK
   struct itimerval delay;
 
   XSync(xDisplay, False);
@@ -2574,6 +2518,7 @@ FrameDelay (int time)
     delay.it_interval.tv_usec = delay.it_value.tv_usec = 0;
     setitimer(ITIMER_REAL, &delay, NULL);
   }
+#endif
 }
 
 #else
@@ -2581,7 +2526,9 @@ FrameDelay (int time)
 void
 FrameDelay (int time)
 {
+#ifdef TODO_GTK
   XSync(xDisplay, False);
+#endif
   if (time > 0)
     usleep(time * 1000);
 }
@@ -2611,7 +2558,7 @@ UpdateLogos (int displ)
     if(optList[W_WHITE-1].handle == NULL) return;
     LoadLogo(&first, 0, 0);
     LoadLogo(&second, 1, appData.icsActive);
-    if(displ) DisplayLogos(optList[W_WHITE-1].handle, optList[W_BLACK+1].handle);
+    if(displ) DisplayLogos(&optList[W_WHITE-1], &optList[W_BLACK+1]);
     return;
 }