do_statusbar_mouse(), reset_statusbar_cursor(),
update_statusbar_line(), and
need_statusbar_horizontal_update(). (DLR)
- - Simplify terminal handling by using raw mode instead of cbreak
- mode. Changes to main(); removal of disable_signals(). (DLR)
- - 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. Changes to
- configure.ac, doc/texinfo/nano.texi, version(),
- handle_sigwinch(), terminal_init(), and total_redraw(). (DLR)
+ - Change slang curses emulation support to turn off the same
+ options as --enable-tiny, as it's hopelessly broken otherwise.
+ Changes to configure.ac, doc/texinfo/nano.texi, and
+ terminal_init(). (DLR)
- chars.c:
nstrncasecmp(), mbstrncasecmp()
- For efficiency, return zero immediately if s1 and s2 point to
uncutting text with the mark on. (DLR)
main()
- Exit if initscr() fails. (DLR)
+ - Simplify terminal handling by using raw mode instead of cbreak
+ mode. (DLR)
- prompt.c:
do_yesno_prompt()
- Remove redundant check for NO_HELP's being FALSE. (DLR)
[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 <slcurses.h>
+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 <slcurses.h>
+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 <slcurses.h>
+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 <slcurses.h>
+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 <slcurses.h>
+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 <slcurses.h>
+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)
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
#endif
#ifdef ENABLE_UTF8
printf(" --enable-utf8");
+#endif
+#ifdef USE_SLANG
+ printf(" --with-slang");
#endif
printf("\n");
}
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();
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. */
* 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
char *locale = setlocale(LC_ALL, "");
if (locale != NULL && (strcasestr(locale, "UTF8") != NULL ||
- strcasestr(locale, "UTF-8") != NULL))
+ strcasestr(locale, "UTF-8") != NULL)) {
+#ifdef USE_SLANG
+ SLutf8_enable(1);
+#endif
utf8_init();
+ }
}
#else
setlocale(LC_ALL, "");