/ prog

PDCurses

No pocas veces se ha escrito sobre la irrelevancia del codigo o su irremediable destino a ser olvidado, pero, como (aspirantes a) programadores deseamos lo mejor para nuestra creacion, que cresca y perdure en el tiempo e incluso pueda ser no solo reconocido, tambien reutilizadas las horas dedicadas en ingeniar los mecanismos y diseños detras de su funcionamiento.

Asi pues, existiendo gran cantidad de lenguajes de programacion, cada uno con sus particularidades y experimentos, es dificil decantarse por una opcion, y sin embargo, descartando lo estilizados, comodos o sinceramente superiores que puedan parecer, lo cierto es que el ecosistema de estos lenguajes modernos no termina de llegar a una “madurez nativa” en aspectos tan basicos como el area grafica, campo en que las librerias relevantes prevalecen ancladas a C y C++

Inequivacomente todo nuevo lenguaje para ser tomado en serio se vera forzado a ofrecer maneras de incorporar (aprovechar, diria alguno) codigo C/C++ y es entonces cuando como exquisitos de la programacion con altos entandares de pureza nos preguntamos si vale la pena esta ilusion de modernidad construida sobre sucias capas de compativilidad forzada. No valdria mas regresar a las fuentes mientras aparece un lenguaje que paracite con gracia a C y C++?

Es en medio de estos pensamientos desviados, tras toquetear varias librerias (TUI) con diseños extraños que la nostalgia me puede y recuerdo a ncurses… pero busco entonces una alternativa menos limitada con aparente buena salud y que brinde mayores comodidades en lo inmediato para digamos, la creacion de videojuegos

En esta busqueda apareciose PDCurses una libreria estilo curses de dominio publico para llevar los programas que utilizan (n)curses a entornos graficos “precindiendo de emulador de terminal”

comor? se imitan la mayoria de capacidades que ejerce (n)curses sobre una terminal pero hechando mano de librerias graficas como X11, SDL1 y SDL2, lo cual permitiria crear “aplicaciones graficas independientes” de herramientas de terminal, como por ejemplo htop o mocp

y? ademas de permitir la portavilidad que el codigo permita por si mismo, establece un “entorno estandarizado” con el cual una aplicacion mantendria un aspecto homogeneo en por ejemplo el color y tamaño de fuente. Al no formar parte de un “emulador de terminal”, permitiria tambien la asignacion de atajos personalizados sin temor y finalmente podria expandirse esta libreria para proporcionar acceso homologado a perifericos como gamepads, ignorar las limitaciones de la terminal accediendo sin fracaso a paletas de color de 8, 16 y 256 colores o directamente RGB, ademas, tambien podria estar disponible la manipulacion directa a nivel de pixel, ventanas (en curses WINDOW) con tamaños distintos de fuente, colores y modos todo ello establecido sobre la simplicidad de ncurses

mas tarde, podria ademas de estas convenientes especulaciones portar la libreria a un conjunto limitado y saludable de C++, para tener codigo algo mas “bonito”… pero dejemos las especulaciones y aterricemos esto en habilidades concretas

como menciona la pagina de PDCurses, se proporcionan varias verciones que a su ves hechan mano de librerias especificas. Pareciendome SDL2 la mas relevante y mas o menos familiar, me centrare en ella.

Adquiramos primero las dependencias necesarias

# ncurses estandar para terminal
apt install libncurses-dev

# solo serian extrictamente necesarias libsdl2-dev y libsdl2-ttf-dev
# pero ya de paso...
apt install libsdl2-dev libsdl2-ttf-dev libsdl2-gfx-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev

Segun parece PDCurses estubo en inactividad por bastante tiempo, por lo que un fork (https://github.com/Bill-Gray/PDCurses) se propuso tomar el relevo. Sin embargo, este tambien callo en inactividad y los cambios que intentaba llebar a cabo no estan completos asi que preferiblemente es mejor acudir a la vercion oficial

La vercion oficial, recientemente ha tomado cierto movimiento, asi que tomar con cautela este esctiro, podria diferir o ser inutil en un futuro cercano. El commit sobre el que se llevaron las pruebas es f407bdbda6e38dfab34f590323a914285bf843dd

Optecion y compilacion

git clone https://github.com/wmcbrine/PDCurses
cd PDCurses/sdl2
make

con esto tenemos nuestra libreria (pdcurses.a) con la cual podemos (intentar) compilar nuestros programitas

Sin dejar el directorio PDCurses/sdl2 descargar un pequeño programa de prueba y compilar de la siguiente forma

# el programita de prueba
wget https://nasciiboy.land/data/nasciiboy.c

# Compilar siempre a ejecutables con un nombre familiar
# ahorra desgaste neuronal, desde tiempos inmemoriales
# elegi nombrar `test` a los binarios
#
# Colocar el fichero a compilar al final de la linea
# permite cambiar el objetivo con facilidad
gcc -O2 -Wall -fPIC -I.. -o test.o -c nasciiboy.c
gcc test.o -o test pdcurses.a -lSDL2

# ejecutar
./test

hala, optendran algo similar a esto

experimentando tambien podria compilarse con la libreria ncurses r-e-a-l

gcc -o test -lncurses nasciiboy.c
./test

asi veo yo la ejucucion en la terminal

ahora, la libreria por defecto utiliza una fuente (tipografia) de mapa de bits, pero, ademas de variar el tamaño en pixeles podemos recurrir tambien a fuentes .ttf

Conseguir la preciada fuente .ttf requiere los siguientes pasos

# borrar para poder recompilar la libreria
make clean
# recompilar con fuente ttf
make WIDE=Y

gcc -O2 -Wall -fPIC -I.. -o test.o -c nasciiboy.c
gcc test.o -o test pdcurses.a -lSDL2 -lSDL2_ttf

# ejecutar
./test

para modificar la fuente y su tamaño debemos entrar en el fichero PDCurses/sdl2/pdcscrn.c

#ifdef PDC_WIDE
# ifndef PDC_FONT_PATH
#  ifdef _WIN32
#   define PDC_FONT_PATH "C:/Windows/Fonts/consola.ttf"
#  elif defined(__APPLE__)
#   define PDC_FONT_PATH "/System/Library/Fonts/Menlo.ttc"
#  else
#   define PDC_FONT_PATH "/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf"
#  endif
# endif
TTF_Font *pdc_ttffont = NULL;
int pdc_font_size =
# ifdef _WIN32
 16;
# else
 17;
# endif
#endif

las lineas se explican por si mismas. Cualquier modificacion, requiere recompilar la libreria (make clean + make WIDE=Y)

Dentro del Makefile (PDCurses/sdl2/Makefile) vemos la variable que activa estas opciones

ifeq ($(WIDE),Y)
	CFLAGS += -DPDC_WIDE
	SFLAGS += $(TFLAGS)
	SLIBS  += $(TLIBS)
endif

finalmente, para evitar un poco de incomodidad en el proceso de compilacion de nasciiboy.c (o el fichero objetivo de sus practicas), sugiero las siguientes modificaciones en el mencionado makefile

Buscar unas lineas mas o menos asi

ifeq ($(OS),Windows_NT)
    ...
else
	RM = rm -f

	SFLAGS = $(shell sdl2-config --cflags)
	SLIBS = $(shell sdl2-config --libs)
    ...
endif

y agregar una variable RUN mas o menos asi

ifeq ($(OS),Windows_NT)
    ...
else
	RUN=./
	RM = rm -f

    ...
endif

ir al final del makefile y agregar lo siguiente

run: test $(SRC)
	$(RUN)test$(E)

test$(E): test.o
	$(LINK) $^ -o $@ $(LDFLAGS) $(TLIBS)

test.o: $(LIBCURSES) $(SRC)
	$(BUILD) -c $(DEMOFLAGS) $(SRC) -o test.o

(en teoria) ahora podriamos compilar nuestro fichero tanto en GNU, OSX y Windows, tal que asi

$ make run SRC=nasciiboy.c

o compilar todo (con fuentes tty) (tras un make clean + rm test)

$ make run WIDE=Y SRC=nasciiboy.c

o realizar cualquier otra modificacion de nuestra conveniencia sobre estas rusticas herramientas, XDDD!

Si buscais documentacion, viene incluida dentro de PDCurses/sdl2/docs. Cuenta tambien con vercion web

Es posible que en el ejemplo no se vea tan marcada la diferencia entre la fuente png, la ttf por defecto y una personalizada asi que aqui otro trio mas de capturas

PNG

DejaVuSansMono

FreeImbo

Estoy algo motivado por modificar esta libreria e incursionar en adaptaciones a un C++ sanamente restringido para mostrar (superficialmente) la construccion de algunos juegos sencillos (snake, tetris, un puzzle y un plataformero) pero no lo espereis con ilusion…

PDCurses, no fue la unica alternativa medianamente interesante, tambien surgieron por el camino BearLib y Libtcod. Advertir que no las he probado

Happy Hacking!

/ prog