10 de enero de 2004

Convierto en variables las cadenas de las piezas en la estructura DropEnable dropEnables[] = {
de Winboard.c, aadiendo las definiciones correspondientes en Languages.h y Common.h. De momento es el nico caso de utilizacin completa del nombre de las piezas entre las lneas del programa. El resto pertenece a recursos de Windows.


12 de enero


He preparado cdigo para mejorar el ttulo mostrado de las partidas, suprimiendo los datos irrelevantes sobre blancas y negras. En LoadGame().
En SetSingleGame() se creaba una variable i que luego no se usaba. Eliminada.

SetSinglePosition(), llamada desde LoadGame() cada vez que se carga uno de ellos, desactivaba al final del proceso la posibilidad de traer de nuevo a la pantalla la lista de partidas, si el fichero era mltiple. Para resolverlo he alterado el orden de llamamiento a las funciones y he aadido una especfica de retorno de la lista de partidas.


14 de enero

Adicin al final de Reset() de instrucciones para cerrar las ventanas de circunstancias y comentarios de una partida, que quedaban pendientes de una anterior al seleccionar otra nueva.
Por qu no se desactiva la opcin Load Game List cuando la partida se elige a travs del recuadro de lista y s si se hace avanzando con las teclas Alt+Pg Up/Down? La razn es quien lo desactiva es SetSinglePosition(). No pasa cuando las operaciones se hacen a travs del recuadro de lista porque yo haba aadido previamente la activacin de la opcin en GameLisPopDown() (en Gamelist.c), que ahora podra quitarse si el mecanismo de que las cosas se hagan bien en LoadGame() funciona (salvo quiz por la necesidad de que Reset() tambin la active).

Para que la partida resaltada en la lista se cargue al pulsar ENTER he marcado la casilla Default button del botn Load del dilogo DLG_GameList en Winboard resources > Dialog. (Ceballos, Visual C++: 296.) Menos claro est lo que haya que hacer para que el resalte se desplace con las teclas de cursor.
No hay que hacer nada! pues el problema en ambos casos es el mismo: el recuadro no tiene el enfoque. Para que todo funcione basta con que el recuadro de la lista sea el enfocado y el que reciba la entrada. Pero la causa de mi confusin es que si se ejecuta Winboard pulsando dos veces sobre el nombre de un fichero de partidas mltiple (y tambin al hacerlo desde el recuadro de Windows Inicio > Ejecutar "C:\Archivos de programa\WinBoard\WinboardA.exe" /ncp "C:\Archivos de programa\WinBoard\RJFisher60.pgn"), al comenzar el programa y desplegarse la lista sigue enfocado el tablero, con lo que la entrada del teclado no afecta al listado. Esto no sucede cuando se ejecuta directamente el programa y luego se carga el fichero mediante Load Game, circunstancia en que el listado tiene el foco y todo funciona normalmente, salvo que es en este caso cuando se producen los errores de acceso a las partidas 2 y 3 de Combinaciones brillantes.pgn.
He intentado solucionarlo asignando explcitamente el foco al crearse el recuadro en Wgamelist.c, GameListPopUp() y luego en todos los puntos del programa en que se llama a LoadGameDialog(), pero sin resultado. El problema del rechazo de partidas subsiste inafectado.

Hay mas cabos sueltos en esta zona del programa. Cuando se produce la denegacin de acceso a las partidas 2 y 3, aparece sin embargo el recuadro de circunstancias y el ttulo se presenta como si la partida se hubiese cargado, solo que el tablero est en la posicin inicial y no en la compuesta, dejndole a uno una vez ms en una situacin ambigua. Puede que aqu resida todo el problema.
Otra cosa que est mal es que el recuadro de circunstancias no siempre reproduce fielmente los datos que se encuentran en el fichero de origen, por razones ignotas.

Asigno la tecla Inicio a la presentacin de la lista de partidas, medianteWinboard resources > Menu > Winboard > Mode > Show Game List > Caption > "Show Game &List...\tInicio". Adems hay que incorporar la tecla en la tabla de aceleradores de Resource Files > winboard.rc > Accelerator > WINBOARD > IDM_ShowGameList	VK_HOME	VIRTKEY. (Cf. Ceballos: 247.) Podra estar en conflicto con su asignacin previa a la realizacin de jugada cuando se est desarrollando una partida.

Desactivo AutoVScroll del dilogo Tags (con lo que ya est eliminado en todos).


20 de enero

Puede haberse elaborado la lista de partidas de un fichero y sin embargo no haberse cargado ninguna (si se cierra el cuadro de seleccin inicial sin elegir ninguna). Para evitar que se permita disponer en este caso de las opciones de desplazamiento del men he modificado AllowDisplacement() para hacer ms rigurosa la condicin.

'lastMult' equivale probablemente en el caso de posiciones a la originaria 'lastLoadGameUseList' en el caso de partidas.

Resuelto el problema del recuadro de dilogo insensible: aadiendo en GameListPopUp() (wgamelist.c) una instruccin que enva a la cola de mensajes la orden de enfocarlo (enfocarse?). Tambin he aadido la conservacin del asidero del dilogo recin creado, cosa que inicialmente no se haca.


22 de enero

He eliminado de 'GameListDialog(), case WM_INITDIALOG' la insercin del ttulo traducido en el recuadro de la lista de partidas, transfirindolo al final de GameListPopUp() para que refleje tambin el nombre del archivo que contiene las partidas listadas.


13 de febrero

He aplicado la traduccin de smbolos de piezas a los mensajes de tres casos de error contenidos en LoadGameOneMove() de backend.c, a saber, case IllegalMove:, case AmbiguousMove: y case ImpossibleMove:.

He aadido texto a las partidas primera y segunda del fichero 'Combinaciones brillantes.pgn' y ahora la denegacin de acceso se produce con la posicin segunda, cargndose sin problemas la tercera, pero reaparece en la posicin novena.


1 de marzo

He aadido algunas sartas nuevas a 'languages.h', he modificado la variable de formato 'deEntre' para que una coma separe el nombre del fichero de las estadsticas y he sustituido en las funciones que elaboran el texto de la continuacin principal los dos puntos y un espacio que, a continuacin del nmero de jugada, indicaban el turno de las negras por un espacio, tres puntos y otro espacio.
Combinaciones brillantes.pgn no deja cargar ahora ms que la partida 2.


2 de marzo

He intentado obtener el fichero de depuracin 'winboard.debug' grabado en el disco, pero no puede hacerse en el acto mediante la combinacin de teclas Ctrl+Alt+F12, porque el Omnibook intercepta esto como orden de apagar la pantalla. Como la opcin tampoco es de las que se salva habitualmente en Winboard.ini, una vez lo he obtenido aadiendo 'debugMode=true' como lnea final suya, pero, como 'winboard.ini' se sobreescribe cada vez, para usos ms continuados he convertido este argumento en habitualmente grabable, modificando la estructura 'debugMode' de la matriz argDescriptors[] de winboard.c, dndole el valor de TRUE.
Esto hace que se salve la situacin actual de la variable correspondiente, pero si cuando se hace este valor es falso, a la prxima ejecucin la depuracin volver a estar inactiva. La primera vez hay por tanto que ponerlo a 'true' a mano en winboard.ini.
El problema parece residir en yylex(), que me resulta totalmente incomprensible. Parece resuelto en la versin  4.2.7, en la que todas las partidas de Combinaciones brillantes se cargan sin problema.


8 de marzo

Termino de pasar todas las modificaciones que introduje en la versin 4.2.6 de Winboard a la 4.2.7. Como la posibilidad de que mis ideas se incorporen a la versin oficial parecen nulas y las de que se concrete la versin multilinge remotas, he decidido completar por mi cuenta la versin espaola, incluyendo la traduccin de los recursos de Windows y muchas otras sartas que haban quedado perdidas. Tambin he modificado la disposicin del men principal, hacindole adoptar la que a m me parece ms clara y racional. He incorporado Debug a las opciones del grupo Modo, para que pueda activarse desde el teclado en mi ordenador.



Winboard resources > Dialog > DLG_GameList > Load > Properties > Styles > Default button: checked.



Frontend.h

//

void SetSingleGame();      // (FG)
void SetSinglePosition();

// void EnableGameList();

//


Backend.c

// necesarios para que funcione la llamada directa a EnableMenuItem()
#include <resource.h>
extern HWND hwndMain;   // (FG)

void
Reset(redraw, init)
     int redraw, init;
{
	...
	//
// eliminar tambin posibles recuadros remanentes
   CommentPopDown();
   TagsPopDown();
//
}


int
LoadGameOneMove(readAhead)
     ChessMove readAhead;
{
    int fromX = 0, fromY = 0, toX = 0, toY = 0, done;
    char promoChar = NULLCHAR;
    ChessMove moveType;
    char move[MSG_SIZ];
    char * p, * q;
    
//
   char transBuf[MSG_SIZ]; // (FG)
//
...
    switch (moveType)
	{
...
       case IllegalMove:
	      if (appData.testLegality)
		  {
            if (appData.debugMode)
	            fprintf(debugFP, "Parsed IllegalMove: %s\n", yy_text);

//
         if (toTranslate)
            TranslateMoveList(transBuf, yy_text,
                              localPieceSymbols);
//
//	         sprintf(move, "Illegal move: %d.%s%s",
	         sprintf(move, illegalMove,
		                      (forwardMostMove / 2) + 1,
		                      WhiteOnMove(forwardMostMove) ? " " : ".. ",
//                            yy_text);
                            toTranslate ? transBuf : yy_text);
	         DisplayError(move, 0);
	         done = TRUE;
		  }
		  else
		  {
...
       case AmbiguousMove:
	      if (appData.debugMode)
	         fprintf(debugFP, "Parsed AmbiguousMove: %s\n", yy_text);
//
         if (toTranslate)
            TranslateMoveList(transBuf, yy_text,
                              localPieceSymbols);
//

//         sprintf(move, "Ambiguous move: %d.%s%s",
         sprintf(move, ambiguousMove,
		                        (forwardMostMove / 2) + 1,
		                        WhiteOnMove(forwardMostMove) ? " " : ".. ",
//                              yy_text);
                              toTranslate ? transBuf : yy_text);
	      DisplayError(move, 0);
	      done = TRUE;
	      break;

       default:
       case ImpossibleMove:
	      if (appData.debugMode)
	         fprintf(debugFP, "Parsed ImpossibleMove: %s\n", yy_text);

//
         if (toTranslate)
            TranslateMoveList(transBuf, yy_text,
                              localPieceSymbols);
//

//	      sprintf(move, "Illegal move: %d.%s%s",
	      sprintf(move, illegalMove,
		                      (forwardMostMove / 2) + 1,
		                      WhiteOnMove(forwardMostMove) ? " " : ".. ",
//                            yy_text);
                            toTranslate ? transBuf : yy_text);
	      DisplayError(move, 0);
	      done = TRUE;
	      break;
   }		// switch (moveType)
...
}


LoadGame()
{
...
	// si hay ms de una partida en el fichero
    // y hay informacin de los contendientes
   if (lg && lg->gameInfo.white && lg->gameInfo.black)
	{
//
		sprintf(buf, "");
	   // mostrar sus nombres
      // pero slo informacin relevante
      if (!(strlen(lg->gameInfo.white) < 2 ||
            lg->gameInfo.white[0] == ' ' ||
            lg->gameInfo.white[0] == '-' ||
            lg->gameInfo.white[0] == '?'))
      {
         if (!(strlen(lg->gameInfo.black) < 2 ||
               lg->gameInfo.black[0] == ' ' ||
               lg->gameInfo.black[0] == '-' ||
               lg->gameInfo.black[0] == '?'))
         {
        	   sprintf(buf, "%s vs. %s", lg->gameInfo.white,
		                lg->gameInfo.black);
         }
         else
         {
	         sprintf(buf, "%s", lg->gameInfo.white);
         }
      }

//
//	   sprintf(buf, "%s vs. %s", lg->gameInfo.white,
//		           lg->gameInfo.black);
	   DisplayTitle(buf);
   }

...

// (FG)
   // Reflejar la situacin en las opciones de men activas
   AllowDisplacement();
   // pero impedir al acceso a un posible archivo de posiciones
   // en todo caso
   SetSinglePosition();

   if (! lg)
      SetSingleGame();
   else
//      EnableGameList();    // que SetSinglePosition() desactiva
      (void) EnableMenuItem(GetMenu(hwndMain),
               IDM_ShowGameList, MF_BYCOMMAND | MF_ENABLED);

//
...
}



Wgamelist.c

VOID
GameListPopUp(FILE * fp, char * filename)
{
	...
   if (gameListDialog)	// si ya hay un recuadro de lista
   {
      SendMessage(gameListDialog, WM_INITDIALOG, 0, 0);
      if (!gameListUp)	// pero est oculto
	     ShowWindow(gameListDialog, SW_SHOW);	// activarlo
   }
   else					// si no lo hay, crearlo
   {
      lpProc = MakeProcInstance((FARPROC)GameListDialog, hInst);
//      CreateDialog(hInst, MAKEINTRESOURCE(DLG_GameList),
      gameListDialog = CreateDialog(hInst, MAKEINTRESOURCE(DLG_GameList),
                        hwndMain, (DLGPROC)lpProc);
      FreeProcInstance(lpProc);
   }
   gameListUp = TRUE;

//         
   // sustituir el ttulo por el traducido (FG)
   // (a eliminar en la versin multilinge)
   // SetWindowText(hDlg, games);
   sprintf(partidas, "%s de %s", games, filename);
   SetWindowText(gameListDialog, partidas);

   PostMessage(gameListDialog, WM_SETFOCUS, 0, 0);
//
}



Winboard.c

ArgDescriptor argDescriptors[] = {
	/* positional arguments */
	{ "loadGameFile", ArgFilename, (LPVOID) &appData.loadGameFile, FALSE },
	...
	{ "-mono", ArgFalse, (LPVOID) &appData.monoMode, FALSE },
//	{ "debugMode", ArgBoolean, (LPVOID) &appData.debugMode, FALSE },
	{ "debugMode", ArgBoolean, (LPVOID) &appData.debugMode, TRUE },
	...
}

WndProc()
{
	...
    case IDM_LoadGame:
//      LoadGameDialog(hwnd, "Load Game from File");
      LoadGameDialog(hwnd, loadGame);
//      SetFocus(gameListDialog);  // (FG)
      break;
	...
}

AllowDisplacement()
{
	...
//   a = ListEmpty(&gameList);
   // puede haber lista y sin embargo no haberse cargado ninguna partida
   a = (ListEmpty(&gameList) || lastLoadGameNumber == 0);

   (void) EnableMenuItem(hmenu, IDM_LoadNextGame,
	...
   (void) EnableMenuItem(hmenu, IDM_ShowGameList,
			      MF_BYCOMMAND | (ListEmpty(&gameList) ? MF_GRAYED : MF_ENABLED));
	...
}

/*
//Eliminada, porque era de un solo uso y en l la he sustituido por
// la ejecucin directa de la instruccin, como ya se haca en GameListPopDown().

VOID
EnableGameList()
{
   extern List gameList;
   HMENU hMenu = GetMenu(hwndMain);

   if (ListTotal(&gameList))     // si hay una lista de partidas, activar la opcin de mostrarla
      (void) EnableMenuItem(hMenu, IDM_ShowGameList, MF_BYCOMMAND | MF_ENABLED);

}
*/
