Tag: Compatibilidad

Corregir colores ANSI en la consola de Windows 10 tras la actualización Windows Anniversary

La actualización de Windows Aniversario por fin llegó a mi equipo y aunque en general parece ser más robusto y seguro, era imposible no encontrarse con nuevos fallos introducidos a causa de esta enorme actualización. No obstante por la curva de fallos real del software, en cada actualización se introducen nuevos fallos no existentes anteriormente o mal solventados.

curva_fallos_software

Obviamente en esta actualización no iba a ser menos, dado el calado tan ambicioso de la actualización. El fallo que he detectado se corresponde a la interpretación de los colores ANSI de la consola de Windows. Concretamente el problema reside en que no se procesan los códigos ANSI de escape, que antes estaba activado por defecto gracias al flag de la consola ENABLE_VIRTUAL_TERMINAL_PROCESSING.

Esto supone un problema para todas las librerías y códigos de Python que usaban los colores ANSI para cambiar de color la letra y fondo de la consola de manera trasnaprente en todos los sistemas.

Ejemplo de la problemática que se empieza a notar en algunas librerías:

https://github.com/pyreadline/pyreadline/issues/46

Ante este problema se me ocurrieron 2 formas de arreglarlo.

 


Solución 1


cmder-main

La primera pasa por añadir un frontend a la maltrecha consola de comandos de Windows y pensé en Cmder por ser un proyecto que además es portable. De esta forma con un lanzador .BAT/.CMD es posible lanzar sobre Cmder lo que queramos y dejar a un lado la problemática de los colores.

La solución consiste en descargar Cmder en su versión portable y añadir el siguiente .BAT que nos permita lanzar Cmder y ejecutar comandos en su inicio:

@echo off
set CMDER_ROOT=%~dp0
start %CMDER_ROOT%\vendor\conemu-maximus5\ConEmu.exe /icon "%CMDER_ROOT%\cmder.exe" /title Cmder /loadcfgfile "%CMDER_ROOT%\config\ConEmu.xml" /cmd cmd /k "%CMDER_ROOT%\vendor\init.bat cd %CD% && cd .. && %~1"

Este archivo que puedes llamar "cmder.bat" debe estar al mismo nivel de directorio que el ejecutable "Cmder.exe". En este caso además se asume que Cmder está en una carpeta en la raíz del proyecto y la consola se posiciona en el nivel inmediatamente superior al que se encuentra "cmder.bat" y "Cmder.exe".

La forma de usar "cmder.bat" asumiendo que está en la carpeta "cmder" sería la siguiente:

start /B cmder.bat "python main.py" ^&^& timeout 5 ^&^& exit

En este caso se lanza un programa en Python, cuyo archivo de ejecución principal es "main.py". Con el parámetro "/B" se lanza la aplicación sin crear una nueva ventana. Adicionalmente se le indica con "^&^& timeout 5" que la consola espere 5 segundos antes de procesar la salida de la consola gracias a "^&^& exit". El resultado sería algo similar a esto:

cmder-launch

 


Solución 2


La segunda solución pasa por añadir un parche en la librería de Python que usa colores ANSI o en su defecto en el "main" de la aplicación. Las líneas de Python que debes añadir para corregir el problema específico de la interpretación de los colores ANSI de la consola de Windows tras la actualización de Windows Aniversario, es la siguiente:

import os
import platform

if os.name == 'nt' and platform.release() == '10' and platform.version() >= '10.0.14393':
    # Fix ANSI color in Windows 10 version 10.0.14393 (Windows Anniversary Update)
    import ctypes
    kernel32 = ctypes.windll.kernel32
    kernel32.SetConsoleMode(kernel32.GetStdHandle(-11), 7)

Gracias a la librería ctype que proporciona tipos de datos compatibles con C, se pueden hacer llamadas a DLLs o librerías compartidas. Esencialmente lo que se hace es habilitar la flag ENABLE_VIRTUAL_TERMINAL_PROCESSING.

De esta forma los colores de la consola pasan de verse así:

ansi_win_before

A verse así:

ansi_win_after

¡Mucho mejor!, ¿no?

Dejo a continuación la referencia al Fix completo publicado en Gist de GitHub:

ANSIColorFix.py

 

Ambas soluciones resuelven la problemática del color ANSI en la consola de Windows tras la actualización Aniversario del sistema. No obstante la primera solución puede ser menos invasiva al no requerir de cambios en el código, pero la segunda es una solución de enfoque más nativo, ofreciendo una solución transparente a los desarrolladores que hacen uso de las librerías afectadas por este problema.

Arreglar problema de texto borroso en Windows 10

Si has actualizado a Windows 10, probablemente hayas notado problemas en la visualización de texto en pantalla, algo que tiene que ver con el DPI (Dots Per Inch) o PPP (Puntos Por Pulgada) del sistema operativo. Aunque por lo general es un ajuste que no se suele modificar al cambiar el software, hay usuarios que reportan fuentes borrosas.

Parece ser que cambios en los DPI del sistema están provocando que algunas fuentes aparezcan borrosas en la interfaz del sistema operativo. La heterogeneidad de este problema  hace que cada caso sea diferente, pero particularmente he experimentado este tipo de problemas en el navegador web, en algunas páginas en concreto, no en todas. También he detectado el mismo problema en las aplicaciones clásicas y los menús de configuración del sistema, mientras que todo funciona perfectamente en las aplicaciones Modern del sistema operativo.

Este error sólo afecta a los usuarios de Windows 10 y no a los de Windows 8 u 8.1. Es extraño ya que estos sistemas comparten una gran cantidad de código, especialmente en lo relacionado con escritorio, fuentes y librerías Modern UI. Claramente Microsoft no ha hecho del todo bien los deberes y su ambición de un único sistema operativo para todos los dispositivos no ha ayudado, creando este tipo de problemas en su nicho de mercado dominante (PC de Escritorio y Portátiles).

Sabiendo de la inexistencia del problema en sistemas Windows 8 y 8.1, hay una aplicación llamada Windows 10 DPI Fix que se encarga automáticamente de aplicar al sistema el método de escalado de fuente de Windows 8 en lugar de utilizar la de Windows 10.

windows-10-dpi-fix

Si tenemos problema con las fuentes borrosas en el sistema, podremos ver cómo con solo ejecutar la herramienta el problema se soluciona y las fuentes dejan de estar borrosas.

Yo personalmente abogo por aplicar una solución particular y focalizada si el problema de las fuentes borrosas no es muy acusado. Con ello quiero decir que si el problema está un conjunto reducido de aplicaciones, las cuales presentan fuentes borrosas, te propongo lo siguiente.

 

Caso práctico

Voy ha plantear un caso particular de una aplicación en la que he sufrido el problema de fuente borrosa. La aplicación en cuestión es XAMPP, la cual en su panel de control, muestra las fuente borrosas.

xampp_windows10_blur

Para los que tenemos una leve miopía es como intentar ver algo lejano sin ponernos las gafas. Algo que resulta bastante molesto... y que perjudica su lectura.

Para solucionarlo ve al ejecutable que lanza la aplicación y dale con el botón derecho a "Propiedades". Se desplegará una ventana, donde hay que seleccionar "Compatibilidad".

compatibilidad_deshabilitar-ajuste-escala

Deberemos marcar  la opción "Deshabilitar el ajuste de escala de la pantalla si se usa la configuración elevada de ppp". Para guardar damos en "Aplicar" y después "Aceptar". Al ejecutar de nuevo la aplicación veremos que el texto es más pequeño (lógico porque hemos deshabilitado el escalado), pero por lo menos no aparece borroso que es nuestro objetivo.

xampp_windows10_no-blur

A efecto de apreciar mejor la diferencia tras aplicar la configuración, os pongo el antes (a la izquierda) y el después (a la derecha). No dudes en hacer click en la imagen para verla con más detalle.

xampp_windows10_difference

Espero que estas propuestas para paliar el problema de los textos borrosos en Windows 10 os sirvan, y sobre todo esperemos que Microsoft haga algo al respecto.

 

Corrección de resoluciones en Windows para Juegos Abandonware

Recientemente he tenido la oportunidad de empezar a trabajar con Windows 10 y de lo primero que he hecho ha sido testear software desarrollado para versiones anteriores de Windows. De las primeras que he probado, ha sido qué tal se comporta Windows 10 con Juegos Abandonware.

Hace ya un tiempo publicaba una entrada que hablaba sobre la corrección de colores en juegos abandonware en sistemas operativos de Windows más modernos. En este aspecto me ha sorprendido Windows 10, con una opción en su capa de compatibilidad para forzar a ejecutar las aplicaciones en modo 8 bits o 16 bits de color.

Propiedades-Compatibilidad_Windows10

Esta opción nos permite arreglar el problema al que dábamos solución en dicha entrada. No obstante aparece otro problema, y es que por mucho que seleccionemos en "Opciones gráficas" la opción de "Escalar a pantalla completa" mantiene el ratio de aspecto. Esto se debe a que las configuraciones que usa el sistema y con las que se lanza un juego abandonware no son heredadas. Esto quiere decir que da igual cuánto te esfuerces en revisar todas las configuraciones que no será la que luego Windows aplique para lanzar el juego. Por ejemplo, si pruebas a ejecutar un clásico como el "Age of Empires 2" verás que se generan dos franjas negras en los lateras.

Age of Empires II Expansion black-bands

Estos juego que tienen más de 10 años, suelen trabajar en resoluciones nativas con una relación de aspecto de 4:3 con unas resoluciones nativas que solían ser de 800x600 y que posteriormente se escalaba a resoluciones mayores o expandía a pantalla completa si la relación de aspecto era distinta.

En versiones anteriores a Windows 10 bastaba con cambiar la resolución a 800x600 y seleccionar en las "Opciones gráficas" la opción "Escalar a pantalla completa" . A partir de este momento podíamos volver a nuestra resolución habitual y bastaba con lanzar el juego. Este procedimiento no es válido para Windows 10 ya que no se hereda la configuración y es necesario volver a fijar la resolución en caliente.

Para cambiar la configuración de la resolución mediante mediante un atajo de teclado, usaremos Hotkey Resolution Changer (HRC) que lo podéis descargar del siguiente enlace:

HRC_-_HotKey_Resolution_Changer_v2_1.exe

Guardaremos el ejecutable en una carpeta y lo ejecutaremos con un doble click.

El programa permite definir varios atajos para cambiar la resolución al momento. A la hora de definir los atajos, intentad que sea una combinación de teclas que no se use en vuestro equipo, como puede ser CTRL+SHIFT+1CTRL+SHIFT+2.

En la primera resolución guardaremos la que usamos, mientras en la segunda buscaremos la de 800x600.

HRC_v2.1

Una vez fijadas las resoluciones con sus respectivos atajos, seleccionamos el icono de minimizar al lado del aspa roja, para que el programa se mantenga residente en la barra de tareas.  Con el HRC configurado, lanzamos el juego.

En el caso particular del "Age of Empires 2", además he creado un “Lanzador.bat“  en la carpeta del ejecutable del juego, con las siguientes líneas:

taskkill /F /IM Explorer.exe
age2_x1.exe normalmouse
start explorer.exe 

La primera línea detiene el proceso "Explorer.exe" para evitar problemas en el color. La segunda línea lanza el juego con el parámetro "normalmouse" que hace que no se cargue el icono del cursor del juego y cargue el del sistema. Esto se hace porque al poner el juego en pantalla completa con el HRC, el cursor desaparece. La tercera línea vuelve a lanzar el proceso "Explorer.exe" cerrado en la primera línea tras terminar la ejecución del juego. La primera línea sigue siendo necesaria a pesar de que se pueda seleccionar el parche de color en la pestaña de compatibilidad, porque cuando se lanza el juego desde “Lanzador.bat“ parece no aplicarse dichas configuraciones.

Lanzamos el juego mediante el lanzador y con el juego en marcha podremos poner la resolución a pantalla completa usando el atajo de teclas CTRL+SHIFT+2,  que aplica la resolución a 800x600 a pantalla completa, gracias a haber configurado para dicha resolución la opción "Escalar a pantalla completa" desde el sistema como se hacía para versiones anteriores de Windows 10.

Age of Empires II Expansion full-screen

Al salir del juego tendréis la resolución de 800x600 en el escritorio. Utilizad el atajo CTRL+SHIFT+1 para poner la resolución que originariamente teníais.

No es una solución del todo decorosa la que se presenta en esta entrada, ya que se cambia en caliente la resolución para el juego que se está renderizando, pero no obstante funciona (que no es poco 😉). A Microsoft se le olvidó este tipo de cosas cuando definía su capa de compatibilidad para Windows 10, que por otro lado es de las más completas hasta la fecha. No es sencillo mantener una retrocompatibilidad tan alta como la que mantiene Windows, para hacer funcionar software diseñado para versiones anteriores y hasta primitivas del sistema.

Corrección de colores en Windows para Juegos Abandonware

El tiempo pasa y la tecnología cambia mejorándose y haciéndose más cómoda y rápida. Los sistemas operativos cómo núcleo y base para la ejecución de programas no son ajenos a ello, y lejos de solamente evolucionar, tienen la difícil tarea de mantener la compatibilidad con lo ya existente.

En el caso concreto de Windows, el cual cumplirá 35 años el próximo 20 de Noviembre, existe multitud de software que ha sido desarrollado. De manera nativa Windows ha intentado ofrecer compatibilidad con el software desarrollado para sistemas anteriores, ya sea de manera implícita sin que el usuario tuviese que hacer nada o explícita, permitiendo que el usuario elija la compatibilidad de manera manual desde propiedades del archivo.

Propiedades-Compatibilidad

Por norma general estas opciones suelen bastar para hacer funcionar buena parte del software antiguo o también denominado Abandonware.

En el caso particular de los juegos suelen ser especialmente útiles estas opciones, permitiendo correr juegos que se diseñaron para sistemas operativos anteriores. En la práctica, y para la gran parte de los casos, las opciones facilitadas por las versiones de Windows más actuales, nos resuelven la papeleta para poder correr dichos juegos.

En casos particulares esto a veces no es suficiente y los juegos a pesar de funcionar, contienen errores gráficos que afectan a la interpretación de los colores originales del juego. Un caso en el que se comprueba fácilmente estos fallos, es el juego de "Age of Empires 2" si se ejecuta, por ejemplo, en un Windows 7.

age_of_empires_color errors

El fallo en la interpretación de los colores es causado por la corrupción de la paleta de colores. El causante de que se corrompan los colores es el proceso "explorer.exe" que se ejecuta en todo momento en el sistema, encargado de gestionar toda la interacción que hay en el escritorio (iconos del escritorio, barra de navegación...).

El problema viene dado porque dicho proceso tiene problemas de funcionamiento para modos de vídeo con color de 16 bits sin aceleración gráfica. Puesto que el proceso explorer presenta dicho problema, el cierre del mismo antes de lanzar el juego, solucionará el problema de corrupción de la paleta de colores.

Un solución práctica consiste en cerrar el proceso explorer, lanzar el juego y volver a lanzar el proceso explorer cuando se cierre el juego. Para ello basta con crear un  archivo con extensión ".bat", por ejemplo "Lanzador.bat".

Dentro del fichero escribiremos las siguientes líneas:

taskkill /F /IM Explorer.exe
EJECUTABLE_DEL_JUEGO.EXE
start explorer.exe 

Este archivo Lanzador.bat es un script que nos lanza el ejecutable (.EXE) que queramos tras cerrar el proceso explorer mediante el comando "taskkill", y queda a la espera de que termine el ejecutable para poder volver a lanzarlo con el comando "start".

Esta solución simple y sencilla es válida para todos aquellos programas y juegos que presenten errores en la paleta de colores.