add support for pdcurses

This commit is contained in:
Andrzej Rybczak
2009-03-25 17:47:10 +01:00
parent f24db993aa
commit 1b22f307ea
5 changed files with 67 additions and 21 deletions

View File

@@ -13,6 +13,7 @@ AC_ARG_ENABLE(clock, AS_HELP_STRING([--enable-clock], [Enable clock screen]), [c
AC_ARG_ENABLE(unicode, AS_HELP_STRING([--enable-unicode], [Enable utf8 support]), [unicode=$enableval], [unicode=yes]) AC_ARG_ENABLE(unicode, AS_HELP_STRING([--enable-unicode], [Enable utf8 support]), [unicode=$enableval], [unicode=yes])
AC_ARG_WITH(taglib, AS_HELP_STRING([--with-taglib], [Enable tag editor]), [taglib=$withval], [taglib=no]) AC_ARG_WITH(taglib, AS_HELP_STRING([--with-taglib], [Enable tag editor]), [taglib=$withval], [taglib=no])
AC_ARG_WITH(curl, AS_HELP_STRING([--with-curl], [Enable fetching lyrics from the Internet]), [curl=$withval], [curl=no]) AC_ARG_WITH(curl, AS_HELP_STRING([--with-curl], [Enable fetching lyrics from the Internet]), [curl=$withval], [curl=no])
AC_ARG_WITH(pdcurses, AS_HELP_STRING([--with-pdcurses], [Link against pdcurses instead of ncurses]), [pdcurses=$withval], [pdcurses=no])
if test "$clock" = "yes"; then if test "$clock" = "yes"; then
AC_DEFINE([ENABLE_CLOCK], [1], [enables clock screen]) AC_DEFINE([ENABLE_CLOCK], [1], [enables clock screen])
@@ -32,23 +33,29 @@ AC_CHECK_HEADERS([iconv.h], , AC_MSG_NOTICE(cannot find iconv.h header, iconv su
dnl ======================== dnl ========================
dnl = checking for ncurses = dnl = checking for ncurses =
dnl ======================== dnl ========================
if test "$pdcurses" = "no" ; then
if test "$unicode" = "yes" ; then if test "$unicode" = "yes" ; then
ncurses_config_bin=ncursesw5-config curses_config_bin=ncursesw5-config
ncurses_lib=ncursesw curses_lib=ncursesw
CPPFLAGS="$CPPFLAGS -D_UTF8" AC_DEFINE([_UTF8], [1], [enables unicode support])
else else
ncurses_config_bin=ncurses5-config curses_config_bin=ncurses5-config
ncurses_lib=ncurses curses_lib=ncurses
fi fi
AC_PATH_PROG(NCURSES_CONFIG, $ncurses_config_bin)
if test "$NCURSES_CONFIG" != "" ; then
CPPFLAGS="$CPPFLAGS `$NCURSES_CONFIG --cflags`"
LDFLAGS="$LDFLAGS `$NCURSES_CONFIG --libs`"
AC_CHECK_LIB($ncurses_lib, initscr, , AC_MSG_ERROR([$ncurses_lib library is required]))
else else
AC_CHECK_LIB($ncurses_lib, initscr, LDFLAGS="$LDFLAGS -l$ncurses_lib", AC_MSG_ERROR([$ncurses_lib library is required])) curses_config_bin=xcurses-config
curses_lib=XCurses
AC_DEFINE([USE_PDCURSES], [1], [enables pdcurses support])
fi fi
AC_CHECK_HEADERS([ncurses.h], , AC_MSG_ERROR([missing ncurses.h header])) AC_PATH_PROG(CURSES_CONFIG, $curses_config_bin)
if test "$CURSES_CONFIG" != "" ; then
CPPFLAGS="$CPPFLAGS `$CURSES_CONFIG --cflags`"
LDFLAGS="$LDFLAGS `$CURSES_CONFIG --libs`"
AC_CHECK_LIB($curses_lib, initscr, , AC_MSG_ERROR([$curses_lib library is required]))
else
AC_CHECK_LIB($curses_lib, initscr, LDFLAGS="$LDFLAGS -l$curses_lib", AC_MSG_ERROR([$ncurses_lib library is required]))
fi
AC_CHECK_HEADERS([curses.h], , AC_MSG_ERROR([missing ncurses.h header]))
dnl ================================= dnl =================================
dnl = checking for curl and pthread = dnl = checking for curl and pthread =

View File

@@ -117,7 +117,7 @@ int main(int argc, char *argv[])
std::streambuf *cerr_buffer = std::cerr.rdbuf(); std::streambuf *cerr_buffer = std::cerr.rdbuf();
std::cerr.rdbuf(errorlog.rdbuf()); std::cerr.rdbuf(errorlog.rdbuf());
InitScreen(Config.colors_enabled); InitScreen("ncmpc++ ver. "VERSION, Config.colors_enabled);
init_current_locale(); init_current_locale();
MainStartY = 2; MainStartY = 2;
@@ -325,6 +325,10 @@ int main(int argc, char *argv[])
} }
else if (input == KEY_RESIZE) else if (input == KEY_RESIZE)
{ {
# ifdef USE_PDCURSES
resize_term(0, 0);
# endif // USE_PDCURSES
RedrawHeader = 1; RedrawHeader = 1;
if (COLS < 20 || LINES < 5) if (COLS < 20 || LINES < 5)

View File

@@ -51,10 +51,14 @@ namespace
void WindowTitle(const string &status) void WindowTitle(const string &status)
{ {
# ifndef USE_PDCURSES
static const string term_type = getenv("TERM") ? getenv("TERM") : ""; static const string term_type = getenv("TERM") ? getenv("TERM") : "";
if (term_type != "linux" && Config.set_window_title) if (term_type != "linux" && Config.set_window_title)
std::cout << "\033]0;" << status << "\7"; std::cout << "\033]0;" << status << "\7";
# else
(void)status;
# endif // USE_PDCURSES
} }
} }

View File

@@ -28,18 +28,33 @@ using namespace NCurses;
using std::string; using std::string;
using std::wstring; using std::wstring;
void NCurses::InitScreen(bool enable_colors) void NCurses::InitScreen(const char *window_title, bool enable_colors)
{ {
const int ColorsTable[] =
{
COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW,
COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE
};
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
# if defined(USE_PDCURSES) && defined(XCURSES)
Xinitscr(1, const_cast<char **>(&window_title));
# else
window_title = 0; // silence compiler
initscr(); initscr();
# endif // USE_PDCURSES && XCURSES
if (has_colors() && enable_colors) if (has_colors() && enable_colors)
{ {
start_color(); start_color();
use_default_colors(); use_default_colors();
int num = 1; int num = 1;
for (int i = -1; i < 8; i++) # ifdef USE_PDCURSES
int i = 0;
# else
int i = -1;
# endif // USE_PDCURSES
for (; i < 8; i++)
for (int j = 0; j < 8; j++) for (int j = 0; j < 8; j++)
init_pair(num++, j, i); init_pair(num++, ColorsTable[j], i < 0 ? i : ColorsTable[i]);
} }
noecho(); noecho();
cbreak(); cbreak();
@@ -424,7 +439,12 @@ string Window::GetString(const string &base, size_t length, size_t width, bool e
input = wgetch(itsWindow); input = wgetch(itsWindow);
// these key codes are special and should be ignored // these key codes are special and should be ignored
if (input < 10 || (input > 10 && input < 32)) if ((input < 10 || (input > 10 && input < 32))
# ifdef USE_PDCURSES
&& input != 8) // backspace key in pdcurses
# else
)
# endif // USE_PDCURSES
continue; continue;
switch (input) switch (input)
@@ -445,6 +465,9 @@ string Window::GetString(const string &base, size_t length, size_t width, bool e
break; break;
} }
case KEY_BACKSPACE: case 127: case KEY_BACKSPACE: case 127:
# ifdef USE_PDCURSES
case 8: // backspace key in pdcurses
# endif // USE_PDCURSES
{ {
if (x <= minx && !beginning) if (x <= minx && !beginning)
break; break;
@@ -458,7 +481,11 @@ string Window::GetString(const string &base, size_t length, size_t width, bool e
} }
else if (beginning > 0) else if (beginning > 0)
beginning--; beginning--;
if (input != KEY_BACKSPACE && input != 127) if (input != KEY_BACKSPACE && input != 127
# ifdef USE_PDCURSES
&& input != 8 // backspace key in pdcurses
# endif // USE_PDCURSES
)
break; // backspace = left & delete. break; // backspace = left & delete.
} }
case KEY_DC: case KEY_DC:

View File

@@ -25,7 +25,11 @@
#include <config.h> #include <config.h>
#endif #endif
#include "ncurses.h" #ifdef USE_PDCURSES
# define XCURSES
#endif
#include "curses.h"
#include <stack> #include <stack>
#include <vector> #include <vector>
@@ -55,7 +59,7 @@ namespace NCurses
typedef void (*GetStringHelper)(const std::wstring &); typedef void (*GetStringHelper)(const std::wstring &);
void InitScreen(bool); void InitScreen(const char *, bool);
void DestroyScreen(); void DestroyScreen();
struct Colors struct Colors