+ Default to ncurses, not slang, because slang only has 128 colour pairs. * src/caca.c: + Disable scrolling to avoid hashmap scrolling optimization code. * src/graphics.c: + Swap fg and bg in the colour pair indexing, so that bg is always right. + Disable alt charset support to exploit my patched slang.tags/v0.99.beta14
@@ -117,6 +117,11 @@ $Id$ | |||||
o S-Lang: | o S-Lang: | ||||
256 character pairs are definable, but only 128 can be used. This is | |||||
because slsmg.c's This_Color variable uses its 8th bit to indicate an | |||||
alternate character set. Replacing a few 0x7F with 0xFF in sldisply.c | |||||
works around the problem but gets rid of the alternate charset. | |||||
o MS-DOS: all bright colours, bright backgrounds, and bright combinations | o MS-DOS: all bright colours, bright backgrounds, and bright combinations | ||||
work using <conio.h>. No need to kludge anything. | work using <conio.h>. No need to kludge anything. | ||||
@@ -17,10 +17,10 @@ dnl AC_PROG_EGREP only exists in autoconf 2.54+, so we use AC_EGREP_CPP right | |||||
dnl now otherwise it might be set in an obscure if statement. | dnl now otherwise it might be set in an obscure if statement. | ||||
AC_EGREP_CPP(foo,foo) | AC_EGREP_CPP(foo,foo) | ||||
AC_ARG_ENABLE(slang, | |||||
[ --enable-slang slang graphics support (default enabled)]) | |||||
AC_ARG_ENABLE(ncurses, | AC_ARG_ENABLE(ncurses, | ||||
[ --enable-ncurses ncurses graphics support (default disabled)]) | |||||
[ --enable-ncurses ncurses graphics support (default enabled)]) | |||||
AC_ARG_ENABLE(slang, | |||||
[ --enable-slang slang graphics support (default disabled)]) | |||||
AC_ARG_ENABLE(conio, | AC_ARG_ENABLE(conio, | ||||
[ --enable-conio DOS conio.h graphics support (default disabled)]) | [ --enable-conio DOS conio.h graphics support (default disabled)]) | ||||
@@ -40,16 +40,16 @@ if test "${enable_conio}" = "yes"; then | |||||
AC_MSG_RESULT(no)]) | AC_MSG_RESULT(no)]) | ||||
AC_DEFINE(USE_CONIO, 1, Define if the backend driver is conio.h) | AC_DEFINE(USE_CONIO, 1, Define if the backend driver is conio.h) | ||||
USE_CONIO=: | USE_CONIO=: | ||||
elif test "${enable_ncurses}" = "yes"; then | |||||
AC_CHECK_HEADER(ncurses.h,:,AC_MSG_ERROR([cannot find ncurses headers])) | |||||
AC_CHECK_LIB(ncurses,initscr,:,AC_MSG_ERROR([cannot find ncurses library])) | |||||
AC_DEFINE(USE_NCURSES, 1, Define if the backend driver is ncurses) | |||||
USE_NCURSES=: | |||||
elif test "${enable_slang}" != "no"; then | |||||
elif test "${enable_slang}" = "yes"; then | |||||
AC_CHECK_HEADER(slang.h,:,AC_MSG_ERROR([cannot find slang headers])) | AC_CHECK_HEADER(slang.h,:,AC_MSG_ERROR([cannot find slang headers])) | ||||
AC_CHECK_LIB(slang,SLkp_init,:,AC_MSG_ERROR([cannot find slang library])) | AC_CHECK_LIB(slang,SLkp_init,:,AC_MSG_ERROR([cannot find slang library])) | ||||
AC_DEFINE(USE_SLANG, 1, Define if the backend driver is slang) | AC_DEFINE(USE_SLANG, 1, Define if the backend driver is slang) | ||||
USE_SLANG=: | USE_SLANG=: | ||||
elif test "${enable_ncurses}" != "no"; then | |||||
AC_CHECK_HEADER(ncurses.h,:,AC_MSG_ERROR([cannot find ncurses headers])) | |||||
AC_CHECK_LIB(ncurses,initscr,:,AC_MSG_ERROR([cannot find ncurses library])) | |||||
AC_DEFINE(USE_NCURSES, 1, Define if the backend driver is ncurses) | |||||
USE_NCURSES=: | |||||
else | else | ||||
AC_MSG_ERROR([could not find any terminal graphics interface]) | AC_MSG_ERROR([could not find any terminal graphics interface]) | ||||
fi | fi | ||||
@@ -97,6 +97,10 @@ int caca_init(void) | |||||
SLtt_set_mouse_mode(1, 0); | SLtt_set_mouse_mode(1, 0); | ||||
SLsmg_refresh(); | SLsmg_refresh(); | ||||
/* Disable scrolling so that hashmap scrolling optimization code | |||||
* does not cause ugly refreshes due to slow terminals */ | |||||
SLtt_Term_Cannot_Scroll = 1; | |||||
#elif defined(USE_NCURSES) | #elif defined(USE_NCURSES) | ||||
mmask_t newmask; | mmask_t newmask; | ||||
@@ -39,6 +39,10 @@ | |||||
# error "no graphics library detected" | # error "no graphics library detected" | ||||
#endif | #endif | ||||
#ifdef HAVE_INTTYPES_H | |||||
# include <inttypes.h> | |||||
#endif | |||||
#include <stdio.h> /* BUFSIZ */ | #include <stdio.h> /* BUFSIZ */ | ||||
#include <string.h> | #include <string.h> | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
@@ -64,7 +68,7 @@ void caca_set_color(enum caca_color fgcolor, enum caca_color bgcolor) | |||||
_caca_fgcolor = fgcolor; | _caca_fgcolor = fgcolor; | ||||
_caca_bgcolor = bgcolor; | _caca_bgcolor = bgcolor; | ||||
#if defined(USE_SLANG) | #if defined(USE_SLANG) | ||||
SLsmg_set_color(fgcolor + 16 * bgcolor); | |||||
SLsmg_set_color((bgcolor + 16 * fgcolor) /*% 128*/); | |||||
#elif defined(USE_NCURSES) | #elif defined(USE_NCURSES) | ||||
attrset(_caca_attr[fgcolor + 16 * bgcolor]); | attrset(_caca_attr[fgcolor + 16 * bgcolor]); | ||||
#elif defined(USE_CONIO) | #elif defined(USE_CONIO) | ||||
@@ -134,7 +138,7 @@ void caca_putstr(int x, int y, const char *s) | |||||
#if defined(USE_SLANG) | #if defined(USE_SLANG) | ||||
SLsmg_gotorc(y, x); | SLsmg_gotorc(y, x); | ||||
SLsmg_write_string(s); | |||||
SLsmg_write_string((char *)(intptr_t)s); | |||||
#elif defined(USE_NCURSES) | #elif defined(USE_NCURSES) | ||||
move(y, x); | move(y, x); | ||||
addstr(s); | addstr(s); | ||||
@@ -198,6 +202,7 @@ int _caca_init_graphics(void) | |||||
/* See SLang ref., 5.4.4. */ | /* See SLang ref., 5.4.4. */ | ||||
static char *slang_colors[16] = | static char *slang_colors[16] = | ||||
{ | { | ||||
/* Standard colours */ | |||||
"black", | "black", | ||||
"blue", | "blue", | ||||
"green", | "green", | ||||
@@ -206,6 +211,7 @@ int _caca_init_graphics(void) | |||||
"magenta", | "magenta", | ||||
"brown", | "brown", | ||||
"lightgray", | "lightgray", | ||||
/* Bright colours */ | |||||
"gray", | "gray", | ||||
"brightblue", | "brightblue", | ||||
"brightgreen", | "brightgreen", | ||||
@@ -218,16 +224,20 @@ int _caca_init_graphics(void) | |||||
int fg, bg; | int fg, bg; | ||||
for(bg = 0; bg < 16; bg++) | |||||
for(fg = 0; fg < 16; fg++) | |||||
for(fg = 0; fg < 16; fg++) | |||||
for(bg = 0; bg < 16; bg++) | |||||
{ | { | ||||
int i = fg + 16 * bg; | |||||
int i = bg + 16 * fg; | |||||
SLtt_set_color(i, NULL, slang_colors[fg], slang_colors[bg]); | SLtt_set_color(i, NULL, slang_colors[fg], slang_colors[bg]); | ||||
} | } | ||||
/* Disable alt charset support so that we get all 256 colour pairs */ | |||||
SLtt_Has_Alt_Charset = 0; | |||||
#elif defined(USE_NCURSES) | #elif defined(USE_NCURSES) | ||||
static int curses_colors[] = | static int curses_colors[] = | ||||
{ | { | ||||
/* Standard curses colours */ | |||||
COLOR_BLACK, | COLOR_BLACK, | ||||
COLOR_BLUE, | COLOR_BLUE, | ||||
COLOR_GREEN, | COLOR_GREEN, | ||||
@@ -252,6 +262,12 @@ int _caca_init_graphics(void) | |||||
/* Activate colour */ | /* Activate colour */ | ||||
start_color(); | start_color(); | ||||
/* If COLORS == 16, it means the terminal supports full bright colours | |||||
* using setab and setaf (will use \e[90m \e[91m etc. for colours >= 8), | |||||
* we can build 16*16 colour pairs. | |||||
* If COLORS == 8, it means the terminal does not know about bright | |||||
* colours and we need to get them through A_BOLD and A_BLINK (\e[1m | |||||
* and \e[5m). We can only build 8*8 colour pairs. */ | |||||
max = COLORS >= 16 ? 16 : 8; | max = COLORS >= 16 ? 16 : 8; | ||||
for(bg = 0; bg < max; bg++) | for(bg = 0; bg < max; bg++) | ||||
@@ -271,7 +287,8 @@ int _caca_init_graphics(void) | |||||
/* Simple fg on bright bg */ | /* Simple fg on bright bg */ | ||||
_caca_attr[fg + 16 * (bg + 8)] = A_BLINK | COLOR_PAIR(col); | _caca_attr[fg + 16 * (bg + 8)] = A_BLINK | COLOR_PAIR(col); | ||||
/* Bright fg on bright bg */ | /* Bright fg on bright bg */ | ||||
_caca_attr[fg + 8 + 16 * (bg + 8)] = A_BLINK | A_BOLD | COLOR_PAIR(col); | |||||
_caca_attr[fg + 8 + 16 * (bg + 8)] = A_BLINK | A_BOLD | |||||
| COLOR_PAIR(col); | |||||
} | } | ||||
} | } | ||||