Fix display of logos
authorH.G. Muller <h.g.muller@hccnet.nl>
Wed, 8 Jun 2011 15:33:34 +0000 (17:33 +0200)
committerH.G. Muller <h.g.muller@hccnet.nl>
Wed, 8 Jun 2011 16:09:26 +0000 (18:09 +0200)
The logo files are now sought relative to the WinBoard install
directory. Non-existing logos cause clearing of the logo, rather than
letting the logo of the prevous engine hang. Logo change is requested
explicitly from the back-end (when an engine is initialized for a new
game), rather than using the kludge in StartChileProcess. This required
a dummy UpdateLogos routine in the XBoard front-end.

backend.c
frontend.h
winboard/winboard.c
xboard.c

index 7309370..4fba970 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -861,6 +861,7 @@ ReplaceEngine(ChessProgramState *cps, int n)
     appData.noChessProgram = FALSE;
     appData.clockMode = TRUE;
     InitEngine(cps, n);
+    UpdateLogos(TRUE);
     if(n) return; // only startup first engine immediately; second can wait
     savCps = cps; // parameter to LoadEngine passed as globals, to allow scheduled calling :-(
     LoadEngine();
@@ -9838,6 +9839,7 @@ NextTourneyGame(int nr, int *swapColors)
     InitEngine(&first, 0);  // initialize ChessProgramStates based on new settings.
     InitEngine(&second, 1);
     CommonEngineInit();     // after this TwoMachinesEvent will create correct engine processes
+    UpdateLogos(FALSE);     // leave display to ModeHiglight()
     return 1;
 }
 
@@ -12854,7 +12856,7 @@ TwoMachinesEvent P((void))
 
     gameMode = TwoMachinesPlay;
     pausing = FALSE;
-    ModeHighlight();
+    ModeHighlight(); // [HGM] logo: this triggers display update of logos
     SetGameInfo();
     DisplayTwoMachinesTitle();
     firstMove = TRUE;
index 9cee154..e63f661 100644 (file)
@@ -119,6 +119,7 @@ int StopClockTimer P((void));
 void StartClockTimer P((long millisec));
 void DisplayWhiteClock P((long timeRemaining, int highlight));
 void DisplayBlackClock P((long timeRemaining, int highlight));
+void UpdateLogos P((int display));
 
 int LoadGameTimerRunning P((void));
 int StopLoadGameTimer P((void));
index 1655d40..b5ba50d 100644 (file)
@@ -889,16 +889,19 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 void\r
 SetUserLogo()\r
 {   // update user logo if necessary\r
-    static char oldUserName[MSG_SIZ], *curName;\r
+    static char oldUserName[MSG_SIZ], dir[MSG_SIZ], *curName;\r
 \r
     if(appData.autoLogo) {\r
          curName = UserName();\r
          if(strcmp(curName, oldUserName)) {\r
-           snprintf(oldUserName, MSG_SIZ, "logos\\%s.bmp", curName);\r
+               GetCurrentDirectory(MSG_SIZ, dir);\r
+               SetCurrentDirectory(installDir);\r
+               snprintf(oldUserName, MSG_SIZ, "logos\\%s.bmp", curName);\r
                userLogo = LoadImage( 0, oldUserName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );    \r
                safeStrCpy(oldUserName, curName, sizeof(oldUserName)/sizeof(oldUserName[0]) );\r
                if(userLogo == NULL)\r
                    userLogo = LoadImage( 0, "logos\\dummy.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); \r
+               SetCurrentDirectory(dir); /* return to prev directory */\r
          }\r
     }\r
 }\r
@@ -956,8 +959,11 @@ EnsureOnScreen(int *x, int *y, int minX, int minY)
 }\r
 \r
 VOID\r
-LoadLogo(ChessProgramState *cps, int n)\r
+LoadLogo(ChessProgramState *cps, int n, Boolean ics)\r
 {\r
+  char buf[MSG_SIZ], dir[MSG_SIZ];\r
+  GetCurrentDirectory(MSG_SIZ, dir);\r
+  SetCurrentDirectory(installDir);\r
   if( appData.logo[n] && appData.logo[n][0] != NULLCHAR) {\r
       cps->programLogo = LoadImage( 0, appData.logo[n], IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );\r
 \r
@@ -965,12 +971,16 @@ LoadLogo(ChessProgramState *cps, int n)
           fprintf( debugFP, "Unable to load logo bitmap '%s'\n", appData.logo[n] );\r
       }\r
   } else if(appData.autoLogo) {\r
-      if(appData.firstDirectory && appData.directory[n][0]) {\r
-       char buf[MSG_SIZ];\r
-         snprintf(buf, MSG_SIZ, "%s/logo.bmp", appData.directory[n]);\r
-       cps->programLogo = LoadImage( 0, buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );    \r
+      if(ics) { // [HGM] logo: in ICS mode second can be used for ICS\r
+       sprintf(buf, "logos\\%s.bmp", appData.icsHost);\r
+       cps->programLogo = LoadImage( 0, buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );\r
+      } else\r
+      if(appData.directory[n] && appData.directory[n][0]) {\r
+        SetCurrentDirectory(appData.directory[n]);\r
+       cps->programLogo = LoadImage( 0, "logo.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );     \r
       }\r
   }\r
+  SetCurrentDirectory(dir); /* return to prev directory */\r
 }\r
 \r
 BOOL\r
@@ -1028,25 +1038,8 @@ InitInstance(HINSTANCE hInstance, int nCmdShow, LPSTR lpCmdLine)
   }\r
 \r
   /* [HGM] logo: Load logos if specified (must be done before InitDrawingSizes) */\r
-  LoadLogo(&first, 0);\r
-\r
-  if( appData.secondLogo && appData.secondLogo[0] != NULLCHAR) {\r
-      second.programLogo = LoadImage( 0, appData.secondLogo, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );\r
-\r
-      if (second.programLogo == NULL && appData.debugMode) {\r
-          fprintf( debugFP, "Unable to load logo bitmap '%s'\n", appData.secondLogo );\r
-      }\r
-  } else if(appData.autoLogo) {\r
-      char buf[MSG_SIZ];\r
-      if(appData.icsActive) { // [HGM] logo: in ICS mode second can be used for ICS\r
-       snprintf(buf, MSG_SIZ, "logos\\%s.bmp", appData.icsHost);\r
-       second.programLogo = LoadImage( 0, buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );\r
-      } else\r
-      if(appData.secondDirectory && appData.secondDirectory[0]) {\r
-       snprintf(buf, MSG_SIZ, "%s\\logo.bmp", appData.secondDirectory);\r
-       second.programLogo = LoadImage( 0, buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );  \r
-      }\r
-  }\r
+  LoadLogo(&first, 0, FALSE);\r
+  LoadLogo(&second, 1, appData.icsActive);\r
 \r
   SetUserLogo();\r
 \r
@@ -3386,7 +3379,10 @@ DrawLogoOnDC(HDC hdc, RECT logoRect, HBITMAP logo)
   HBITMAP hbm;\r
   int w = 100, h = 50;\r
 \r
-  if(logo == NULL) return;\r
+  if(logo == NULL) {\r
+    if(!logoHeight) return;\r
+    FillRect( hdc, &logoRect, whitePieceBrush );\r
+  }\r
 //  GetClientRect(hwndMain, &Rect);\r
 //  bufferBitmap = CreateCompatibleBitmap(hdc, Rect.right-Rect.left+1,\r
 //                                     Rect.bottom-Rect.top+1);\r
@@ -3444,6 +3440,15 @@ DisplayLogos()
   }\r
 }\r
 \r
+void\r
+UpdateLogos(int display)\r
+{ // called after loading new engine(s), in tourney or from menu\r
+  LoadLogo(&first, 0, FALSE);\r
+  LoadLogo(&second, 1, appData.icsActive);\r
+  InitDrawingSizes(-2, 0); // adapt layout of board window to presence/absence of logos\r
+  if(display) DisplayLogos();\r
+}\r
+\r
 static HDC hdcSeek;\r
 \r
 // [HGM] seekgraph\r
@@ -8912,9 +8917,6 @@ StartChildProcess(char *cmdLine, char *dir, ProcRef *pr)
    * dir relative to the directory WinBoard loaded from. */\r
   GetCurrentDirectory(MSG_SIZ, buf);\r
   SetCurrentDirectory(installDir);\r
-  // kludgey way to update logos in tourney, as long as back-end can't do it\r
-  if(!strcmp(cmdLine, first.program)) LoadLogo(&first, 0); else\r
-  if(!strcmp(cmdLine, second.program)) LoadLogo(&second, 1);\r
   SetCurrentDirectory(dir);\r
 \r
   /* Now create the child process. */\r
index 5ea91bb..f6eee62 100644 (file)
--- a/xboard.c
+++ b/xboard.c
@@ -9001,3 +9001,9 @@ void DrawArrowHighlight(int fromX, int fromY, int toX,int toY)
     if( IsDrawArrowEnabled() && fromX >= 0 && fromY >= 0 && toX >= 0 && toY >= 0)
         DrawArrowBetweenSquares(fromX, fromY, toX, toY);
 }
+
+void UpdateLogos(int displ)
+{
+    return; // no logos in XBoard yet
+}
+