10 de enero de 2004

Convierto en variables las cadenas de las piezas en la estructura DropEnable dropEnables[] = {
de Winboard.c, añadiendo las definiciones correspondientes en Languages.h y Common.h. De momento es el único caso de utilización completa del nombre de las piezas entre las líneas del programa. El resto pertenece a recursos de Windows.


12 de enero


He preparado código para mejorar el título 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 múltiple. Para resolverlo he alterado el orden de llamamiento a las funciones y he añadido una específica de retorno de la lista de partidas.


14 de enero

Adición 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 opción Load Game List cuando la partida se elige a través del recuadro de lista y sí si se hace avanzando con las teclas Alt+Pg Up/Down? La razón es quien lo desactiva es SetSinglePosition(). No pasa cuando las operaciones se hacen a través del recuadro de lista porque yo había añadido previamente la activación de la opción en GameLisPopDown() (en Gamelist.c), que ahora podría quitarse si el mecanismo de que las cosas se hagan bien en LoadGame() funciona (salvo quizá por la necesidad de que Reset() también la active).

Para que la partida resaltada en la lista se cargue al pulsar ENTER he marcado la casilla Default button del botón Load del diálogo 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 confusión es que si se ejecuta Winboard pulsando dos veces sobre el nombre de un fichero de partidas múltiple (y también 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 explícitamente 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 denegación de acceso a las partidas 2 y 3, aparece sin embargo el recuadro de circunstancias y el título se presenta como si la partida se hubiese cargado, solo que el tablero está en la posición inicial y no en la compuesta, dejándole a uno una vez más en una situación 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 presentación de la lista de partidas, medianteWinboard resources > Menu > Winboard > Mode > Show Game List > Caption > "Show Game &List...\tInicio". Además 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.) Podría estar en conflicto con su asignación previa a la realización de jugada cuando se esté desarrollando una partida.

Desactivo AutoVScroll del diálogo 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 selección 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 más rigurosa la condición.

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

Resuelto el problema del recuadro de diálogo insensible: añadiendo en GameListPopUp() (wgamelist.c) una instrucción que envía a la cola de mensajes la orden de enfocarlo (¿enfocarse?). También he añadido la conservación del asidero del diálogo recién creado, cosa que inicialmente no se hacía.


22 de enero

He eliminado de 'GameListDialog(), case WM_INITDIALOG' la inserción del título traducido en el recuadro de la lista de partidas, transfiriéndolo al final de GameListPopUp() para que refleje también el nombre del archivo que contiene las partidas listadas.


13 de febrero

He aplicado la traducción de símbolos 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 añadido texto a las partidas primera y segunda del fichero 'Combinaciones brillantes.pgn' y ahora la denegación de acceso se produce con la posición segunda, cargándose sin problemas la tercera, pero reaparece en la posición novena.


1 de marzo

He añadido algunas sartas nuevas a 'languages.h', he modificado la variable de formato 'deEntre' para que una coma separe el nombre del fichero de las estadísticas y he sustituido en las funciones que elaboran el texto de la continuación principal los dos puntos y un espacio que, a continuación del número de jugada, indicaban el turno de las negras por un espacio, tres puntos y otro espacio.
Combinaciones brillantes.pgn no deja cargar ahora más que la partida 2.


2 de marzo

He intentado obtener el fichero de depuración 'winboard.debug' grabado en el disco, pero no puede hacerse en el acto mediante la combinación de teclas Ctrl+Alt+F12, porque el Omnibook intercepta esto como orden de apagar la pantalla. Como la opción tampoco es de las que se salva habitualmente en Winboard.ini, una vez lo he obtenido añadiendo 'debugMode=true' como línea final suya, pero, como 'winboard.ini' se sobreescribe cada vez, para usos más continuados he convertido este argumento en habitualmente grabable, modificando la estructura 'debugMode' de la matriz argDescriptors[] de winboard.c, dándole el valor de TRUE.
Esto hace que se salve la situación actual de la variable correspondiente, pero si cuando se hace este valor es falso, a la próxima ejecución la depuración 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 versión  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 versión 4.2.6 de Winboard a la 4.2.7. Como la posibilidad de que mis ideas se incorporen a la versión oficial parecen nulas y las de que se concrete la versión multilingüe remotas, he decidido completar por mi cuenta la versión española, incluyendo la traducción de los recursos de Windows y muchas otras sartas que habían quedado perdidas. También he modificado la disposición del menú principal, haciéndole adoptar la que a mí me parece más 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 también 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 más de una partida en el fichero
    // y hay información de los contendientes
   if (lg && lg->gameInfo.white && lg->gameInfo.black)
	{
//
		sprintf(buf, "");
	   // mostrar sus nombres
      // pero sólo información 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 situación 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 título por el traducido (FG)
   // (a eliminar en la versión multilingüe)
   // 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 ejecución directa de la instrucción, como ya se hacía en GameListPopDown().

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

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

}
*/
