From: David Lawrence Ramsey Date: Tue, 18 Dec 2007 15:55:48 +0000 (+0000) Subject: revert last changes, but disable all the same features that X-Git-Tag: v2.1.0~31 X-Git-Url: https://git.wh0rd.org/?a=commitdiff_plain;h=f78bc85db1140bff9478f619abb70959a1904f02;p=nano.git revert last changes, but disable all the same features that --enable-tiny does when --with-slang is used git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@4204 35c25a1d-7b9e-4130-9fde-d3aeb78583b8 --- diff --git a/ChangeLog b/ChangeLog index 728aa27a..3329b8ef 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,13 +1,10 @@ 2007-12-17 David Lawrence Ramsey - * configure.ac, doc/texinfo/nano.texi, nano.c (version, - handle_sigwinch, terminal_init), winio.c (total_redraw): Remove - slang curses emulation support, as it's hopelessly broken, and - it doesn't make the binary very much smaller, especially when - --enable-tiny is used. + * configure.ac, doc/texinfo/nano.texi, nano.c (terminal_init): + Change slang curses emulation support to turn off the same + options as --enable-tiny, as it's hopelessly broken otherwise. * nano.c (disable_signals, main): Simplify terminal handling by - using raw mode instead of cbreak mode. This eliminates the need - for disable_signals(). + using raw mode instead of cbreak mode. * text.c (execute_command): Call terminal_init() instead of just disable_signals() after executing the command, as the command may have changed the terminal settings. diff --git a/configure.ac b/configure.ac index 3811ba27..9eedb731 100644 --- a/configure.ac +++ b/configure.ac @@ -185,6 +185,205 @@ fi], [enable_utf8=auto]) AC_MSG_RESULT($enable_utf8) +AC_MSG_CHECKING([whether to use slang]) +CURSES_LIB_NAME="" +AC_ARG_WITH(slang, +[ --with-slang[=DIR] Use the slang library instead of curses], +[ case "$with_slang" in + no) + AC_MSG_RESULT(no) + ;; + *) + AC_MSG_RESULT(yes) + + if test x$with_slang != xyes; then + # Add additional search path + LDFLAGS="-L$with_slang/lib $LDFLAGS" + CPPFLAGS="-I$with_slang/include $CPPFLAGS" + fi + + if test x$enable_utf8 != xno; then + AC_CHECK_HEADER(slcurses.h, + AC_MSG_CHECKING([for SLutf8_enable in -lslang]) + _libs=$LIBS + LIBS="$LIBS -lslang" + AC_TRY_RUN([ +#include +int main(void) +{ + SLutf8_enable(1); + return 0; +}], + [AC_MSG_RESULT(yes) + AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.]) slang_support=yes + CURSES_LIB_WIDE=yes + if test x$with_slang != xyes; then + CURSES_LIB="-L${with_slang}/lib -lslang" + else + CURSES_LIB="-lslang" + fi + CURSES_LIB_NAME=slang], + [AC_MSG_RESULT(no) + + # We might need the term library + for termlib in ncurses curses termcap terminfo termlib; do + AC_CHECK_LIB([${termlib}], tputs, [tcap="-l$termlib"]) + test -n "$tcap" && break + done + + AC_MSG_CHECKING([for SLutf8_enable in -lslang $tcap]) + LIBS="$LIBS $tcap" + AC_TRY_RUN([ +#include +int main(void) +{ + SLutf8_enable(1); + return 0; +}], + [AC_MSG_RESULT(yes) + AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.]) slang_support=yes + CURSES_LIB_WIDE=yes + if test x$with_slang != xyes; then + CURSES_LIB="-L${with_slang}/lib -lslang $tcap" + else + CURSES_LIB="-lslang $tcap" + fi + CURSES_LIB_NAME=slang], + [AC_MSG_RESULT(no) + + # We might need the math library + AC_MSG_CHECKING([for SLutf8_enable in -lslang $tcap -lm]) + LIBS="$LIBS -lm" + AC_TRY_RUN([ +#include +int main(void) +{ + SLutf8_enable(1); + return 0; +}], + [AC_MSG_RESULT(yes) + AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.]) slang_support=yes + CURSES_LIB_WIDE=yes + if test x$with_slang != xyes; then + CURSES_LIB="-L${with_slang}/lib -lslang $tcap -lm" + else + CURSES_LIB="-lslang $tcap -lm" + fi + CURSES_LIB_NAME=slang], + [AC_MSG_RESULT(no)], + AC_MSG_WARN([*** Can not use slang when cross-compiling]))], + AC_MSG_WARN([*** Can not use slang when cross-compiling]))], + AC_MSG_WARN([*** Can not use slang when cross-compiling])), + AC_MSG_ERROR([ +*** The header file slcurses.h was not found. If you wish to use +*** slang support this header file is required. Please either +*** install a version of slang that includes the slcurses.h file or +*** do not call the configure script with --with-slang.])) + fi + + if eval "test x$CURSES_LIB_NAME = x"; then + # Reset libs if the above slang tests failed + if test x$enable_utf8 != xno; then + LIBS=$_libs + fi + + AC_CHECK_HEADER(slcurses.h, + AC_MSG_CHECKING([for SLtt_initialize in -lslang]) + _libs=$LIBS + LIBS="$LIBS -lslang" + AC_TRY_RUN([ +#include +int main(void) +{ + SLtt_initialize(NULL); + return 0; +}], + [AC_MSG_RESULT(yes) + AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.]) slang_support=yes + if test x$with_slang != xyes; then + CURSES_LIB="-L${with_slang}/lib -lslang" + else + CURSES_LIB="-lslang" + fi + CURSES_LIB_NAME=slang], + [AC_MSG_RESULT(no) + + # We might need the term library + for termlib in ncurses curses termcap terminfo termlib; do + AC_CHECK_LIB([${termlib}], tputs, [tcap="-l$termlib"]) + test -n "$tcap" && break + done + + AC_MSG_CHECKING([for SLtt_initialize in -lslang $tcap]) + LIBS="$LIBS $tcap" + AC_TRY_RUN([ +#include +int main(void) +{ + SLtt_initialize(NULL); + return 0; +}], + [AC_MSG_RESULT(yes) + AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.]) slang_support=yes + if test x$with_slang != xyes; then + CURSES_LIB="-L${with_slang}/lib -lslang $tcap" + else + CURSES_LIB="-lslang $tcap" + fi + CURSES_LIB_NAME=slang], + [AC_MSG_RESULT(no) + + # We might need the math library + AC_MSG_CHECKING([for SLtt_initialize in -lslang $tcap -lm]) + LIBS="$LIBS -lm" + AC_TRY_RUN([ +#include +int main(void) +{ + SLtt_initialize(NULL); + return 0; +}], + [AC_MSG_RESULT(yes) + AC_DEFINE(USE_SLANG, 1, [Define to use the slang wrappers for curses instead of native curses.]) slang_support=yes + if test x$with_slang != xyes; then + CURSES_LIB="-L${with_slang}/lib -lslang $tcap -lm" + else + CURSES_LIB="-lslang $tcap -lm" + fi + CURSES_LIB_NAME=slang], + [AC_MSG_RESULT(no)], + AC_MSG_WARN([*** Can not use slang when cross-compiling]))], + AC_MSG_WARN([*** Can not use slang when cross-compiling]))], + AC_MSG_WARN([*** Can not use slang when cross-compiling])), + AC_MSG_ERROR([ +*** The header file slcurses.h was not found. If you wish to use +*** slang support this header file is required. Please either +*** install a version of slang that includes the slcurses.h file or +*** do not call the configure script with --with-slang.])) + fi + + if test "${_libs+set}" = "set"; then + LIBS=$_libs + fi + + if test x$with_slang != xyes; then + LDFLAGS=${_ldflags} + fi + ;; + esac], [AC_MSG_RESULT(no)]) + + if test x$with_slang != xno; then + AC_DEFINE(NANO_TINY, 1, [Define this to make the nano executable as small as possible.]) tiny_support=yes + AC_DEFINE(DISABLE_BROWSER, 1, [Define this to disable the built-in file browser.]) + AC_DEFINE(DISABLE_HELP, 1, [Define this to disable the help text display.]) + AC_DEFINE(DISABLE_JUSTIFY, 1, [Define this to disable the justify routines.]) + AC_DEFINE(DISABLE_MOUSE, 1, [Define this to disable the mouse functions.]) + AC_DEFINE(DISABLE_OPERATINGDIR, 1, [Define this to disable the setting of the operating directory (chroot of sorts).]) + AC_DEFINE(DISABLE_SPELLER, 1, [Define this to disable the spell checker functions.]) + AC_DEFINE(DISABLE_TABCOMP, 1, [Define to disable the tab completion functions for files and search strings.]) + AC_DEFINE(DISABLE_WRAPPING, 1, [Define this to disable all text wrapping.]) + fi + AM_CONDITIONAL(USE_COLOR, test x$color_support = xyes) AM_CONDITIONAL(USE_NANORC, test x$nanorc_support = xyes) @@ -279,14 +478,16 @@ else AC_MSG_ERROR([ *** UTF-8 support was requested, but insufficient UTF-8 support was *** detected in your curses and/or C libraries. Please verify that your -*** curses was built with wide character support, and that your C -*** library was built with wide character support.]) +*** slang was built with UTF-8 support or your curses was built with +*** wide character support, and that your C library was built with wide +*** character support.]) elif test x$enable_utf8 != xno; then AC_MSG_WARN([ *** Insufficient UTF-8 support was detected in your curses and/or C -*** libraries. If you want UTF-8 support, please verify that your -*** curses was built with wide character support, and that your C -*** library was built with wide character support.]) +*** libraries. If you want UTF-8 support, please verify that your slang +*** was built with UTF-8 support or your curses was built with wide +*** character support, and that your C library was built with wide +*** character support.]) fi fi diff --git a/doc/texinfo/nano.texi b/doc/texinfo/nano.texi index 847756fb..5cc1f0d1 100644 --- a/doc/texinfo/nano.texi +++ b/doc/texinfo/nano.texi @@ -842,11 +842,15 @@ Disable long line wrapping by default when nano is run as root. @item --enable-utf8 Enable support for reading and writing Unicode files. This will require -a wide version of curses. +either a wide version of curses, or a UTF-8-enabled version of Slang. @item --disable-utf8 Disable support for reading and writing Unicode files. +@item --with-slang +Compiling @code{nano} with Slang is supported, and will make the binary +notably smaller than if compiled with ncurses or other curses libraries. + @end table @contents diff --git a/src/nano.c b/src/nano.c index a5f7e5ee..a6c6a768 100644 --- a/src/nano.c +++ b/src/nano.c @@ -944,6 +944,9 @@ void version(void) #endif #ifdef ENABLE_UTF8 printf(" --enable-utf8"); +#endif +#ifdef USE_SLANG + printf(" --with-slang"); #endif printf("\n"); } @@ -1143,10 +1146,19 @@ RETSIGTYPE handle_sigwinch(int signal) if (filepart != NULL) unpartition_filestruct(&filepart); +#ifdef USE_SLANG + /* Slang curses emulation brain damage, part 1: If we just do what + * curses does here, it'll only work properly if the resize made the + * window smaller. Do what mutt does: Leave and immediately reenter + * Slang screen management mode. */ + SLsmg_reset_smg(); + SLsmg_init_smg(); +#else /* Do the equivalent of what Minimum Profit does: Leave and * immediately reenter curses mode. */ endwin(); doupdate(); +#endif /* Restore the terminal to its previous state. */ terminal_init(); @@ -1246,6 +1258,19 @@ void disable_extended_io(void) tcsetattr(0, TCSANOW, &term); } +#ifdef USE_SLANG +/* Disable interpretation of the special control keys in our terminal + * settings. */ +void disable_signals(void) +{ + struct termios term; + + tcgetattr(0, &term); + term.c_lflag &= ~ISIG; + tcsetattr(0, TCSANOW, &term); +} +#endif + #ifndef NANO_TINY /* Enable interpretation of the special control keys in our terminal * settings. */ @@ -1291,12 +1316,34 @@ void enable_flow_control(void) * control characters. */ void terminal_init(void) { - raw(); - nonl(); - noecho(); - disable_extended_io(); - if (ISSET(PRESERVE)) - enable_flow_control(); +#ifdef USE_SLANG + /* Slang curses emulation brain damage, part 2: Slang doesn't + * implement raw(), nonl(), or noecho() properly, so there's no way + * to properly reinitialize the terminal using them. We have to + * disable the special control keys using termios, save the terminal + * state after the first call, and restore it on subsequent + * calls. */ + static struct termios newterm; + static bool newterm_set = FALSE; + + if (!newterm_set) { +#endif + + raw(); + nonl(); + noecho(); + disable_extended_io(); + if (ISSET(PRESERVE)) + enable_flow_control(); + +#ifdef USE_SLANG + disable_signals(); + + tcgetattr(0, &newterm); + newterm_set = TRUE; + } else + tcsetattr(0, TCSANOW, &newterm); +#endif } /* Read in a character, interpret it as a shortcut or toggle if diff --git a/src/nano.h b/src/nano.h index 28b22591..370d6d33 100644 --- a/src/nano.h +++ b/src/nano.h @@ -61,8 +61,15 @@ #define PATH_MAX 4096 #endif +#ifdef USE_SLANG +/* Slang support. */ +#include +/* Slang curses emulation brain damage, part 3: Slang doesn't define the + * curses equivalents of the Insert or Delete keys. */ +#define KEY_DC SL_KEY_DELETE +#define KEY_IC SL_KEY_IC /* Ncurses support. */ -#ifdef HAVE_NCURSES_H +#elif defined(HAVE_NCURSES_H) #include #else /* Curses support. */ diff --git a/src/proto.h b/src/proto.h index 055e59dc..43b8746c 100644 --- a/src/proto.h +++ b/src/proto.h @@ -475,6 +475,9 @@ void allow_pending_sigwinch(bool allow); void do_toggle(const toggle *which); #endif void disable_extended_io(void); +#ifdef USE_SLANG +void disable_signals(void); +#endif #ifndef NANO_TINY void enable_signals(void); #endif diff --git a/src/winio.c b/src/winio.c index bf4be4d3..b205b1df 100644 --- a/src/winio.c +++ b/src/winio.c @@ -3167,7 +3167,14 @@ void edit_update(update_type location) /* Unconditionally redraw the entire screen. */ void total_redraw(void) { +#ifdef USE_SLANG + /* Slang curses emulation brain damage, part 4: Slang doesn't define + * curscr. */ + SLsmg_touch_screen(); + SLsmg_refresh(); +#else wrefresh(curscr); +#endif } /* Unconditionally redraw the entire screen, and then refresh it using