diff --git a/CMakeLists.txt b/CMakeLists.txt index 28a61e7463..01b3df6075 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -141,12 +141,15 @@ if(NOT DAEMON_EXTERNAL_APP) set(NACL_RUNTIME_PATH "" CACHE STRING "Directory containing the NaCl binaries") - # Not supported on mac because the included version is too old - if(APPLE) - set(USE_CURSES OFF) - elseif(WIN32) + if (WIN32) + # The alternative code is based on non-curses unix terminal functions. set(USE_CURSES ON) else() + if (NOT APPLE) + # Not supported on macOS because the included version is too old. + option(USE_CURSES_NCURSES "Use ncurses instead of PDCursesMod" ON) + endif() + option(USE_CURSES "Enable fancy colors in terminal's output" ON) endif() @@ -657,20 +660,24 @@ endif() # Curses, pdcurses on Windows and ncursesw on Unix if (BUILD_CLIENT OR BUILD_TTY_CLIENT OR BUILD_SERVER OR BUILD_DUMMY_APP) if (USE_CURSES) - if (WIN32) - set(LIBS_ENGINE_BASE ${LIBS_ENGINE_BASE} gdi32 comdlg32) + if (USE_CURSES_NCURSES) + # Tells FindCurses that ncurses is required. + set(CURSES_NEED_NCURSES 1) + + add_definitions(-DUSE_CURSES -DUSE_CURSES_NCURSES) + find_package(CursesW REQUIRED) + set(LIBS_ENGINE_BASE ${LIBS_ENGINE_BASE} ${CURSESW_LIBRARIES}) + include_directories(${CURSESW_INCLUDE_DIR}) + else () + if (WIN32) + set(LIBS_ENGINE_BASE ${LIBS_ENGINE_BASE} gdi32 comdlg32) + endif() add_definitions(-DPDC_WIDE -DPDC_FORCE_UTF8 -DPDC_RGB -DUSE_CURSES) add_library(srclibs-pdcurses EXCLUDE_FROM_ALL ${PDCURSESLIST}) set_target_properties(srclibs-pdcurses PROPERTIES POSITION_INDEPENDENT_CODE 1 FOLDER "libs") set(LIBS_ENGINE_BASE ${LIBS_ENGINE_BASE} srclibs-pdcurses) include_directories(${LIB_DIR}/pdcursesmod) - else () - add_definitions(-DUSE_CURSES) - set(CURSES_NEED_NCURSES 1) # Tells FindCurses that ncurses is required - find_package(CursesW REQUIRED) - set(LIBS_ENGINE_BASE ${LIBS_ENGINE_BASE} ${CURSESW_LIBRARIES}) - include_directories(${CURSESW_INCLUDE_DIR}) endif() endif() endif() diff --git a/src/engine/sys/con_curses.cpp b/src/engine/sys/con_curses.cpp index 15bef2d815..ebc73a2d67 100644 --- a/src/engine/sys/con_curses.cpp +++ b/src/engine/sys/con_curses.cpp @@ -103,12 +103,12 @@ static void CON_SetColor( WINDOW *win, const Color::Color& color ) static void CON_UpdateCursor() { // pdcurses uses a different mechanism to move the cursor than ncurses -#ifdef _WIN32 - move( LINES - 1, Color::StrlenNocolor( PROMPT ) + 8 + input_field.GetViewCursorPos() ); - wnoutrefresh( stdscr ); -#else +#ifdef USE_CURSES_NCURSES wmove( inputwin, 0, input_field.GetViewCursorPos() ); wnoutrefresh( inputwin ); +#else + move( LINES - 1, Color::StrlenNocolor( PROMPT ) + 8 + input_field.GetViewCursorPos() ); + wnoutrefresh( stdscr ); #endif } @@ -228,7 +228,12 @@ static void CON_Redraw() { return; } - resizeterm( winsz.ws_row, winsz.ws_col ); + + #if defined(USE_CURSES_NCURSES) + resizeterm( winsz.ws_row, winsz.ws_col ); + #else + resize_term( winsz.ws_row, winsz.ws_col ); + #endif #endif delwin( logwin ); diff --git a/srclibs.cmake b/srclibs.cmake index eb44155c66..6c5e4a2f43 100644 --- a/srclibs.cmake +++ b/srclibs.cmake @@ -99,16 +99,34 @@ set(PDCURSESLIST ${LIB_DIR}/pdcursesmod/pdcurses/touch.c ${LIB_DIR}/pdcursesmod/pdcurses/util.c ${LIB_DIR}/pdcursesmod/pdcurses/window.c - ${LIB_DIR}/pdcursesmod/wingui/pdcclip.c - ${LIB_DIR}/pdcursesmod/wingui/pdcdisp.c - ${LIB_DIR}/pdcursesmod/wingui/pdcgetsc.c - ${LIB_DIR}/pdcursesmod/wingui/pdckbd.c - ${LIB_DIR}/pdcursesmod/wingui/pdcscrn.c - ${LIB_DIR}/pdcursesmod/wingui/pdcsetsc.c - ${LIB_DIR}/pdcursesmod/wingui/pdcutil.c - ${LIB_DIR}/pdcursesmod/wingui/pdcwin.h ) +if (WIN32) + set(PDCURSESLIST + ${PDCURSESLIST} + ${LIB_DIR}/pdcursesmod/wingui/pdcclip.c + ${LIB_DIR}/pdcursesmod/wingui/pdcdisp.c + ${LIB_DIR}/pdcursesmod/wingui/pdcgetsc.c + ${LIB_DIR}/pdcursesmod/wingui/pdckbd.c + ${LIB_DIR}/pdcursesmod/wingui/pdcscrn.c + ${LIB_DIR}/pdcursesmod/wingui/pdcsetsc.c + ${LIB_DIR}/pdcursesmod/wingui/pdcutil.c + ${LIB_DIR}/pdcursesmod/wingui/pdcwin.h + ) +else() + set(PDCURSESLIST + ${PDCURSESLIST} + ${LIB_DIR}/pdcursesmod/vt/pdcclip.c + ${LIB_DIR}/pdcursesmod/vt/pdcdisp.c + ${LIB_DIR}/pdcursesmod/vt/pdcgetsc.c + ${LIB_DIR}/pdcursesmod/vt/pdckbd.c + ${LIB_DIR}/pdcursesmod/vt/pdcscrn.c + ${LIB_DIR}/pdcursesmod/vt/pdcsetsc.c + ${LIB_DIR}/pdcursesmod/vt/pdcutil.c + ${LIB_DIR}/pdcursesmod/vt/pdcvt.h + ) +endif() + set(TINYFORMATLIST ${LIB_DIR}/tinyformat/tinyformat.h )