Initial step to split NCurses- and SLang-based TTY layers.

This commit is contained in:
Andrew Borodin 2009-05-10 19:01:15 +04:00
parent 389e5bf613
commit ea0cb38b9e
22 changed files with 1117 additions and 903 deletions

View File

@ -532,6 +532,7 @@ if test -n "$use_smbfs"; then
AC_CONFIG_SUBDIRS([vfs/samba]) AC_CONFIG_SUBDIRS([vfs/samba])
fi fi
AM_CONDITIONAL(USE_SCREEN_SLANG, [test x"$with_screen" = xslang])
AM_CONDITIONAL(USE_EDIT, [test -n "$use_edit"]) AM_CONDITIONAL(USE_EDIT, [test -n "$use_edit"])
AM_CONDITIONAL(USE_VFS, [test "x$use_vfs" = xyes]) AM_CONDITIONAL(USE_VFS, [test "x$use_vfs" = xyes])
AM_CONDITIONAL(USE_VFS_NET, [test x"$use_net_code" = xtrue]) AM_CONDITIONAL(USE_VFS_NET, [test x"$use_net_code" = xtrue])

View File

@ -257,13 +257,6 @@ void edit_scroll_screen_over_cursor (WEdit * edit)
#define edit_move(x,y) widget_move(edit, y, x); #define edit_move(x,y) widget_move(edit, y, x);
/* Set colorpair by index, don't interpret S-Lang "emulated attributes" */
#ifdef HAVE_SLANG
#define lowlevel_set_color(x) SLsmg_set_color(x & 0x7F)
#else
#define lowlevel_set_color(x) attrset(MY_COLOR_PAIR(color))
#endif
struct line_s { struct line_s {
unsigned int ch; unsigned int ch;
unsigned int style; unsigned int style;
@ -327,7 +320,7 @@ print_to_widget (WEdit *edit, long row, int start_col, int start_col_real,
#if 0 #if 0
if (color != EDITOR_NORMAL_COLOR) { if (color != EDITOR_NORMAL_COLOR) {
textchar = ' '; textchar = ' ';
lowlevel_set_color (color); tty_lowlevel_setcolor (color);
} else } else
#endif #endif
set_color (EDITOR_WHITESPACE_COLOR); set_color (EDITOR_WHITESPACE_COLOR);
@ -338,7 +331,7 @@ print_to_widget (WEdit *edit, long row, int start_col, int start_col_real,
} else if (style & MOD_MARKED) { } else if (style & MOD_MARKED) {
set_color (EDITOR_MARKED_COLOR); set_color (EDITOR_MARKED_COLOR);
} else { } else {
lowlevel_set_color (color); tty_lowlevel_setcolor (color);
} }
} }
if ( textchar > 255 ) { if ( textchar > 255 ) {

View File

@ -826,7 +826,7 @@ void set_hintbar(const char *str)
{ {
label_set_text (the_hint, str); label_set_text (the_hint, str);
if (ok_to_refresh > 0) if (ok_to_refresh > 0)
refresh(); mc_refresh();
} }
void print_vfs_message (const char *msg, ...) void print_vfs_message (const char *msg, ...)

View File

@ -1,15 +1,28 @@
noinst_LTLIBRARIES = libmctty.la noinst_LTLIBRARIES = libmctty.la
libmctty_la_SOURCES = \ if USE_SCREEN_SLANG
TTY_SCREEN_SRC = \
color-slang.c color-slang.h \
tty-slang.c tty-slang.h
else
TTY_SCREEN_SRC = \
color-ncurses.c color-ncurses.h \
tty-ncurses.c tty-ncurses.h
endif
TTY_SRC = \
color-internal.c color-internal.h\
color.c color.h \ color.c color.h \
key.c key.h keyxdef.c \ key.c key.h keyxdef.c \
mouse.c mouse.h \ mouse.c mouse.h \
myslang.h slint.c \
rxvt.c \ rxvt.c \
tty.c tty.h \ tty.c tty.h \
win.c win.h \ win.c win.h \
x11conn.c x11conn.h x11conn.c x11conn.h
libmctty_la_SOURCES = $(TTY_SRC) $(TTY_SCREEN_SRC)
libmctty_la_CFLAGS = -I../ -I$(top_srcdir)/src \ libmctty_la_CFLAGS = -I../ -I$(top_srcdir)/src \
$(GLIB_CFLAGS) \ $(GLIB_CFLAGS) \
-DDATADIR=\""$(pkgdatadir)/"\" -DLOCALEDIR=\""$(localedir)"\" -DDATADIR=\""$(pkgdatadir)/"\" -DLOCALEDIR=\""$(localedir)"\"

96
src/tty/color-internal.c Normal file
View File

@ -0,0 +1,96 @@
/** \file color-internal.c
* \brief Source: Internal stuff of color setup
*/
#include <config.h>
#include <sys/types.h> /* size_t */
#include "../../src/tty/color-internal.h"
struct color_table_s const color_table [] = {
{ "black", COLOR_BLACK },
{ "gray", COLOR_BLACK | A_BOLD },
{ "red", COLOR_RED },
{ "brightred", COLOR_RED | A_BOLD },
{ "green", COLOR_GREEN },
{ "brightgreen", COLOR_GREEN | A_BOLD },
{ "brown", COLOR_YELLOW },
{ "yellow", COLOR_YELLOW | A_BOLD },
{ "blue", COLOR_BLUE },
{ "brightblue", COLOR_BLUE | A_BOLD },
{ "magenta", COLOR_MAGENTA },
{ "brightmagenta", COLOR_MAGENTA | A_BOLD },
{ "cyan", COLOR_CYAN },
{ "brightcyan", COLOR_CYAN | A_BOLD },
{ "lightgray", COLOR_WHITE },
{ "white", COLOR_WHITE | A_BOLD },
{ "default", 0 } /* default color of the terminal */
};
struct colorpair color_map [] = {
{ "normal=", 0, 0 }, /* normal */ /* 1 */
{ "selected=", 0, 0 }, /* selected */
{ "marked=", 0, 0 }, /* marked */
{ "markselect=", 0, 0 }, /* marked/selected */
{ "errors=", 0, 0 }, /* errors */
{ "menu=", 0, 0 }, /* menu entry */
{ "reverse=", 0, 0 }, /* reverse */
/* Dialog colors */
{ "dnormal=", 0, 0 }, /* Dialog normal */ /* 8 */
{ "dfocus=", 0, 0 }, /* Dialog focused */
{ "dhotnormal=", 0, 0 }, /* Dialog normal/hot */
{ "dhotfocus=", 0, 0 }, /* Dialog focused/hot */
{ "viewunderline=", 0, 0 }, /* _\b? sequence in view, underline in editor */
{ "menusel=", 0, 0 }, /* Menu selected color */ /* 13 */
{ "menuhot=", 0, 0 }, /* Color for menu hotkeys */
{ "menuhotsel=", 0, 0 }, /* Menu hotkeys/selected entry */
{ "helpnormal=", 0, 0 }, /* Help normal */ /* 16 */
{ "helpitalic=", 0, 0 }, /* Italic in help */
{ "helpbold=", 0, 0 }, /* Bold in help */
{ "helplink=", 0, 0 }, /* Not selected hyperlink */
{ "helpslink=", 0, 0 }, /* Selected hyperlink */
{ "gauge=", 0, 0 }, /* Color of the progress bar (percentage) *//* 21 */
{ "input=", 0, 0 },
/* Per file types colors */
{ "directory=", 0, 0 }, /* 23 */
{ "executable=", 0, 0 },
{ "link=", 0, 0 }, /* symbolic link (neither stale nor link to directory) */
{ "stalelink=", 0, 0 }, /* stale symbolic link */
{ "device=", 0, 0 },
{ "special=", 0, 0 }, /* sockets, fifo */
{ "core=", 0, 0 }, /* core files */ /* 29 */
{ 0, 0, 0 }, /* not usable (DEFAULT_COLOR_INDEX) *//* 30 */
{ 0, 0, 0 }, /* unused */
{ 0, 0, 0 }, /* not usable (A_REVERSE) */
{ 0, 0, 0 }, /* not usable (A_REVERSE_BOLD) */
/* editor colors start at 34 */
{ "editnormal=", 0, 0 }, /* normal */ /* 34 */
{ "editbold=", 0, 0 }, /* search->found */
{ "editmarked=", 0, 0 }, /* marked/selected */
{ "editwhitespace=", 0, 0 }, /* whitespace */
/* error dialog colors start at 38 */
{ "errdhotnormal=", 0, 0 }, /* Error dialog normal/hot */ /* 38 */
{ "errdhotfocus=", 0, 0 }, /* Error dialog focused/hot */
};
size_t
color_table_len (void)
{
return sizeof (color_table)/sizeof(color_table [0]);
}
size_t
color_map_len (void)
{
return sizeof (color_map)/sizeof(color_map [0]);
}

107
src/tty/color-internal.h Normal file
View File

@ -0,0 +1,107 @@
/** \file color-internal.h
* \brief Header: Internal stuff of color setup
*/
#ifndef MC_COLOR_INTERNAL_H
#define MC_COLOR_INTERNAL_H
#include <sys/types.h> /* size_t */
#ifdef HAVE_SLANG
# include "../../src/tty/tty-slang.h"
#else
# include "../../src/tty/tty-ncurses.h"
#endif /* HAVE_SLANG */
struct color_table_s {
const char *name;
int value;
};
extern const struct color_table_s const color_table [];
#ifdef HAVE_SLANG
# define CTYPE const char *
#else
# define CTYPE int
#endif /* HAVE_SLANG */
struct colorpair {
const char *name; /* Name of the entry */
CTYPE fg; /* foreground color */
CTYPE bg; /* background color */
};
extern struct colorpair color_map [];
#ifdef HAVE_SLANG
# define color_value(i) color_table [i].name
# define color_name(i) color_table [i].name
# define color_map_fg(n) color_map [n].fg
# define color_map_bg(n) color_map [n].bg
#else
# define color_value(i) color_table [i].value
# define color_name(i) color_table [i].name
# define color_map_fg(n) (color_map [n].fg & COLOR_WHITE)
# define color_map_bg(n) (color_map [n].bg & COLOR_WHITE)
#endif /* HAVE_SLANG */
static const char default_colors[] = {
"normal=lightgray,blue:"
"selected=black,cyan:"
"marked=yellow,blue:"
"markselect=yellow,cyan:"
"errors=white,red:"
"menu=white,cyan:"
"reverse=black,lightgray:"
"dnormal=black,lightgray:"
"dfocus=black,cyan:"
"dhotnormal=blue,lightgray:"
"dhotfocus=blue,cyan:"
"viewunderline=brightred,blue:"
"menuhot=yellow,cyan:"
"menusel=white,black:"
"menuhotsel=yellow,black:"
"helpnormal=black,lightgray:"
"helpitalic=red,lightgray:"
"helpbold=blue,lightgray:"
"helplink=black,cyan:"
"helpslink=yellow,blue:"
"gauge=white,black:"
"input=black,cyan:"
"directory=white,blue:"
"executable=brightgreen,blue:"
"link=lightgray,blue:"
"stalelink=brightred,blue:"
"device=brightmagenta,blue:"
"core=red,blue:"
"special=black,blue:"
"editnormal=lightgray,blue:"
"editbold=yellow,blue:"
"editmarked=black,cyan:"
"editwhitespace=brightblue,blue:"
"errdhotnormal=yellow,red:"
"errdhotfocus=yellow,lightgray"
};
struct colors_avail {
struct colors_avail *next;
char *fg, *bg;
int index;
};
extern struct colors_avail c;
extern int max_index;
size_t color_table_len (void);
size_t color_map_len (void);
void configure_colors (void);
void load_dialog_colors (void);
void get_color (const char *cpp, CTYPE *colp);
int alloc_color_pair (CTYPE foreground, CTYPE background);
#endif /* MC_COLOR_INTERNAL_H */

125
src/tty/color-ncurses.c Normal file
View File

@ -0,0 +1,125 @@
/* Color setup for NCurses screen library
Copyright (C) 1994, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2007, 2008, 2009 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
/** \file color-ncurses.c
* \brief Source: NCUrses-specific color setup
*/
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h> /* size_t*/
#include "../../src/global.h"
#include "../../src/tty/tty-ncurses.h"
#include "../../src/tty/color.h" /* variables */
#include "../../src/tty/color-internal.h"
int attr_pairs [MAX_PAIRS];
void
init_colors (void)
{
if (has_colors () && !disable_colors)
use_colors = 1;
if (use_colors) {
const size_t map_len = color_map_len ();
size_t i;
start_color ();
configure_colors ();
if (map_len > MAX_PAIRS) {
/* This message should only be seen by the developers */
fprintf (stderr,
"Too many defined colors, resize MAX_PAIRS on color.c");
exit (1);
}
if (use_colors) {
/* Always white on black */
mc_init_pair (DEFAULT_COLOR_INDEX, COLOR_WHITE, COLOR_BLACK);
}
for (i = 0; i < map_len; i++)
if (color_map [i].name != NULL) {
mc_init_pair (i + 1, color_map_fg (i), color_map_bg (i));
/*
* ncurses doesn't remember bold attribute in the color pairs,
* so we should keep track of it in a separate array.
*/
attr_pairs [i + 1] = color_map [i].fg & A_BOLD;
}
}
load_dialog_colors ();
}
/* Functions necessary to implement syntax highlighting */
void
mc_init_pair (int index, CTYPE foreground, CTYPE background)
{
init_pair (index, foreground, background);
if (index > max_index)
max_index = index;
}
int
try_alloc_color_pair (const char *fg, const char *bg)
{
int fg_index, bg_index;
int bold_attr;
struct colors_avail *p = &c;
c.index = EDITOR_NORMAL_COLOR_INDEX;
for (;;) {
if (((fg && p->fg) ? !strcmp (fg, p->fg) : fg == p->fg) != 0
&& ((bg && p->bg) ? !strcmp (bg, p->bg) : bg == p->bg) != 0)
return p->index;
if (!p->next)
break;
p = p->next;
}
p->next = g_new (struct colors_avail, 1);
p = p->next;
p->next = 0;
p->fg = fg ? g_strdup (fg) : 0;
p->bg = bg ? g_strdup (bg) : 0;
if (!fg)
/* Index in color_map array = COLOR_INDEX - 1 */
fg_index = color_map[EDITOR_NORMAL_COLOR_INDEX - 1].fg;
else
get_color (fg, &fg_index);
if (!bg)
bg_index = color_map[EDITOR_NORMAL_COLOR_INDEX - 1].bg;
else
get_color (bg, &bg_index);
bold_attr = fg_index & A_BOLD;
fg_index = fg_index & COLOR_WHITE;
bg_index = bg_index & COLOR_WHITE;
p->index = alloc_color_pair (fg_index, bg_index);
attr_pairs [p->index] = bold_attr;
return p->index;
}

19
src/tty/color-ncurses.h Normal file
View File

@ -0,0 +1,19 @@
/** \file color-ncurses.h
* \brief Header: NCurses-specific color setup
*/
#ifndef MC_COLOR_NCURSES_H
#define MC_COLOR_NCURSES_H
#define MAX_PAIRS 64
extern int attr_pairs [MAX_PAIRS];
#define MY_COLOR_PAIR(x) (COLOR_PAIR (x) | attr_pairs [x])
#define IF_COLOR(co, bw) (use_colors ? MY_COLOR_PAIR (co) : bw)
#define MARKED_SELECTED_COLOR IF_COLOR (4, A_REVERSE | A_BOLD)
void mc_init_pair (int index, int foreground, int background);
#endif /* MC_COLOR_NCURSES_H */

111
src/tty/color-slang.c Normal file
View File

@ -0,0 +1,111 @@
/* Color setup for S_Lang screen library
Copyright (C) 1994, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2007, 2008, 2009 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
/** \file color-slang.c
* \brief Source: S-Lang-specific color setup
*/
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h> /* size_t */
#include "../../src/global.h"
#include "../../src/tty/tty-slang.h"
#include "../../src/tty/color.h" /* variables */
#include "../../src/tty/color-internal.h"
void
init_colors (void)
{
/* FIXME: if S-Lang is used, has_colors() must be called regardless
of whether we are interested in its result */
if (has_colors () && !disable_colors)
use_colors = 1;
if (use_colors) {
const size_t map_len = color_map_len ();
size_t i;
start_color ();
configure_colors ();
if (use_colors) {
/*
* We are relying on undocumented feature of
* S-Lang to make COLOR_PAIR(DEFAULT_COLOR_INDEX)
* the default fg/bg of the terminal.
* Hopefully, future versions of S-Lang will
* document this feature.
*/
SLtt_set_color (DEFAULT_COLOR_INDEX, NULL, (char *) "default", (char *) "default");
}
for (i = 0; i < map_len; i++)
if (color_map [i].name != NULL)
mc_init_pair (i + 1, color_map_fg(i), color_map_bg(i));
}
load_dialog_colors ();
}
/* Functions necessary to implement syntax highlighting */
void
mc_init_pair (int index, CTYPE foreground, CTYPE background)
{
if (!background)
background = "default";
if (!foreground)
foreground = "default";
SLtt_set_color (index, (char *) "", (char *) foreground, (char *) background);
if (index > max_index)
max_index = index;
}
int
try_alloc_color_pair (const char *fg, const char *bg)
{
struct colors_avail *p = &c;
c.index = EDITOR_NORMAL_COLOR_INDEX;
for (;;) {
if (((fg && p->fg) ? (strcmp (fg, p->fg) == 0) : (fg == p->fg)) != 0
&& ((bg && p->bg) ? (strcmp (bg, p->bg) == 0) : (bg == p->bg)) != 0)
return p->index;
if (p->next == NULL)
break;
p = p->next;
}
p->next = g_new (struct colors_avail, 1);
p = p->next;
p->next = NULL;
p->fg = fg ? g_strdup (fg) : NULL;
p->bg = bg ? g_strdup (bg) : NULL;
if (fg == NULL
/* Index in color_map array = COLOR_INDEX - 1 */
fg = color_map[EDITOR_NORMAL_COLOR_INDEX - 1].fg;
if (bg == NULL
bg = color_map[EDITOR_NORMAL_COLOR_INDEX - 1].bg;
p->index = alloc_color_pair (fg, bg);
return p->index;
}

15
src/tty/color-slang.h Normal file
View File

@ -0,0 +1,15 @@
/** \file color-slang.h
* \brief Header: S-Lang-specific color setup
*/
#ifndef MC_COLOR_SLANG_H
#define MC_COLOR_SLANG_H
#define IF_COLOR(co, bw) (use_colors ? COLOR_PAIR (co) : bw)
#define MARKED_SELECTED_COLOR IF_COLOR (4, (SLtt_Use_Ansi_Colors ? A_BOLD_REVERSE : A_REVERSE | A_BOLD))
void mc_init_pair (int index, const char *foreground, const char *background);
#endif /* MC_COLOR_SLANG_H */

View File

@ -1,6 +1,6 @@
/* Color setup /* Color setup
Copyright (C) 1994, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, Copyright (C) 1994, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2007 Free Software Foundation, Inc. 2007, 2008, 2009 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -25,141 +25,38 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/types.h> /* size_t */
#include "../../src/global.h" #include "../../src/global.h"
#include "../../src/tty/tty.h" #include "../../src/tty/tty.h"
#include "../../src/setup.h" /* For the externs */
#include "../../src/tty/color.h" #include "../../src/tty/color.h"
#include "../../src/tty/color-internal.h"
/* Set to force black and white display at program startup */ #include "../../src/setup.h" /* setup_color_string, term_color_string */
int disable_colors = 0;
/* Set if we are actually using colors */ /* Set if we are actually using colors */
int use_colors = 0; gboolean use_colors = FALSE;
/* Color styles for normal and error dialogs */ /* Color styles for normal and error dialogs */
int dialog_colors [4]; int dialog_colors [4];
int alarm_colors [4]; int alarm_colors [4];
#define ELEMENTS(arr) ( sizeof(arr) / sizeof((arr)[0]) ) void
get_color (const char *cpp, CTYPE *colp)
#ifdef HAVE_SLANG
# define color_map_fg(n) color_map[n].fg
# define color_map_bg(n) color_map[n].bg
#else
# define color_map_fg(n) (color_map[n].fg & COLOR_WHITE)
# define color_map_bg(n) (color_map[n].bg & COLOR_WHITE)
#endif
struct colorpair {
const char *name; /* Name of the entry */
CTYPE fg; /* foreground color */
CTYPE bg; /* background color */
};
static struct colorpair color_map [] = {
{ "normal=", 0, 0 }, /* normal */ /* 1 */
{ "selected=", 0, 0 }, /* selected */
{ "marked=", 0, 0 }, /* marked */
{ "markselect=", 0, 0 }, /* marked/selected */
{ "errors=", 0, 0 }, /* errors */
{ "menu=", 0, 0 }, /* menu entry */
{ "reverse=", 0, 0 }, /* reverse */
/* Dialog colors */
{ "dnormal=", 0, 0 }, /* Dialog normal */ /* 8 */
{ "dfocus=", 0, 0 }, /* Dialog focused */
{ "dhotnormal=", 0, 0 }, /* Dialog normal/hot */
{ "dhotfocus=", 0, 0 }, /* Dialog focused/hot */
{ "viewunderline=", 0, 0 }, /* _\b? sequence in view, underline in editor */
{ "menusel=", 0, 0 }, /* Menu selected color */ /* 13 */
{ "menuhot=", 0, 0 }, /* Color for menu hotkeys */
{ "menuhotsel=", 0, 0 }, /* Menu hotkeys/selected entry */
{ "helpnormal=", 0, 0 }, /* Help normal */ /* 16 */
{ "helpitalic=", 0, 0 }, /* Italic in help */
{ "helpbold=", 0, 0 }, /* Bold in help */
{ "helplink=", 0, 0 }, /* Not selected hyperlink */
{ "helpslink=", 0, 0 }, /* Selected hyperlink */
{ "gauge=", 0, 0 }, /* Color of the progress bar (percentage) *//* 21 */
{ "input=", 0, 0 },
/* Per file types colors */
{ "directory=", 0, 0 }, /* 23 */
{ "executable=", 0, 0 },
{ "link=", 0, 0 }, /* symbolic link (neither stale nor link to directory) */
{ "stalelink=", 0, 0 }, /* stale symbolic link */
{ "device=", 0, 0 },
{ "special=", 0, 0 }, /* sockets, fifo */
{ "core=", 0, 0 }, /* core files */ /* 29 */
{ 0, 0, 0 }, /* not usable (DEFAULT_COLOR_INDEX) *//* 30 */
{ 0, 0, 0 }, /* unused */
{ 0, 0, 0 }, /* not usable (A_REVERSE) */
{ 0, 0, 0 }, /* not usable (A_REVERSE_BOLD) */
/* editor colors start at 34 */
{ "editnormal=", 0, 0 }, /* normal */ /* 34 */
{ "editbold=", 0, 0 }, /* search->found */
{ "editmarked=", 0, 0 }, /* marked/selected */
{ "editwhitespace=", 0, 0 }, /* whitespace */
{ "editlinestate=", 0, 0 }, /* line number bar*/
/* error dialog colors start at 39 */
{ "errdhotnormal=", 0, 0 }, /* Error dialog normal/hot */ /* 39 */
{ "errdhotfocus=", 0, 0 }, /* Error dialog focused/hot */
};
struct color_table_s {
const char *name;
int value;
};
static struct color_table_s const color_table [] = {
{ "black", COLOR_BLACK },
{ "gray", COLOR_BLACK | A_BOLD },
{ "red", COLOR_RED },
{ "brightred", COLOR_RED | A_BOLD },
{ "green", COLOR_GREEN },
{ "brightgreen", COLOR_GREEN | A_BOLD },
{ "brown", COLOR_YELLOW },
{ "yellow", COLOR_YELLOW | A_BOLD },
{ "blue", COLOR_BLUE },
{ "brightblue", COLOR_BLUE | A_BOLD },
{ "magenta", COLOR_MAGENTA },
{ "brightmagenta", COLOR_MAGENTA | A_BOLD },
{ "cyan", COLOR_CYAN },
{ "brightcyan", COLOR_CYAN | A_BOLD },
{ "lightgray", COLOR_WHITE },
{ "white", COLOR_WHITE | A_BOLD },
{ "default", 0 } /* default color of the terminal */
};
#ifdef HAVE_SLANG
# define color_value(i) color_table [i].name
# define color_name(i) color_table [i].name
#else
# define color_value(i) color_table [i].value
# define color_name(i) color_table [i].name
#endif
static void get_color (const char *cpp, CTYPE *colp)
{ {
const size_t table_len = color_table_len ();
size_t i; size_t i;
for (i = 0; i < ELEMENTS(color_table); i++){ for (i = 0; i < table_len; i++)
if (strcmp (cpp, color_name (i)) == 0) { if (strcmp (cpp, color_name (i)) == 0) {
*colp = color_value (i); *colp = color_value (i);
return; break;
}
} }
} }
static void get_two_colors (char **cpp, struct colorpair *colorpairp) static void
get_two_colors (char **cpp, struct colorpair *colorpairp)
{ {
char *p = *cpp; char *p = *cpp;
int state; int state;
@ -183,14 +80,17 @@ static void get_two_colors (char **cpp, struct colorpair *colorpairp)
*cpp = p + 1; *cpp = p + 1;
} }
} }
get_color (*cpp, state ? &colorpairp->bg : &colorpairp->fg); get_color (*cpp, state ? &colorpairp->bg : &colorpairp->fg);
} }
static void configure_colors_string (const char *the_color_string) static void
configure_colors_string (const char *the_color_string)
{ {
const size_t map_len = color_map_len ();
char *color_string, *p; char *color_string, *p;
size_t i; size_t i;
int found; gboolean found;
if (!the_color_string) if (!the_color_string)
return; return;
@ -200,9 +100,9 @@ static void configure_colors_string (const char *the_color_string)
while (*color_string == ' ' || *color_string == '\t') while (*color_string == ' ' || *color_string == '\t')
color_string++; color_string++;
found = 0; found = FALSE;
for (i = 0; i < ELEMENTS(color_map); i++){ for (i = 0; i < map_len; i++){
int klen; size_t klen;
if (!color_map [i].name) if (!color_map [i].name)
continue; continue;
@ -211,7 +111,7 @@ static void configure_colors_string (const char *the_color_string)
if (strncmp (color_string, color_map [i].name, klen) == 0) { if (strncmp (color_string, color_map [i].name, klen) == 0) {
color_string += klen; color_string += klen;
get_two_colors (&color_string, &color_map [i]); get_two_colors (&color_string, &color_map [i]);
found = 1; found = TRUE;
} }
} }
if (!found) { if (!found) {
@ -224,47 +124,9 @@ static void configure_colors_string (const char *the_color_string)
g_free (p); g_free (p);
} }
static void configure_colors (void) void
configure_colors (void)
{ {
gchar *default_colors = g_strconcat (
"normal=lightgray,blue:"
"selected=black,cyan:"
"marked=yellow,blue:"
"markselect=yellow,cyan:"
"errors=white,red:"
"menu=white,cyan:"
"reverse=black,lightgray:"
"dnormal=black,lightgray:"
"dfocus=black,cyan:"
"dhotnormal=blue,lightgray:"
"dhotfocus=blue,cyan:"
"viewunderline=brightred,blue:"
"menuhot=yellow,cyan:"
"menusel=white,black:"
"menuhotsel=yellow,black:"
"helpnormal=black,lightgray:"
"helpitalic=red,lightgray:"
"helpbold=blue,lightgray:"
"helplink=black,cyan:"
"helpslink=yellow,blue:"
"gauge=white,black:"
"input=black,cyan:"
"directory=white,blue:"
,
"executable=brightgreen,blue:"
"link=lightgray,blue:"
"stalelink=brightred,blue:"
"device=brightmagenta,blue:"
"core=red,blue:"
"special=black,blue:"
"editnormal=lightgray,blue:"
"editbold=yellow,blue:"
"editmarked=black,cyan:"
"editwhitespace=brightblue,blue:"
"editlinestate=white,cyan:"
"errdhotnormal=yellow,red:"
"errdhotfocus=yellow,lightgray", NULL);
extern char *command_line_colors; extern char *command_line_colors;
configure_colors_string (default_colors); configure_colors_string (default_colors);
@ -272,15 +134,9 @@ static void configure_colors (void)
configure_colors_string (term_color_string); configure_colors_string (term_color_string);
configure_colors_string (getenv ("MC_COLOR_TABLE")); configure_colors_string (getenv ("MC_COLOR_TABLE"));
configure_colors_string (command_line_colors); configure_colors_string (command_line_colors);
g_free(default_colors);
} }
#ifndef HAVE_SLANG void
#define MAX_PAIRS 64
int attr_pairs [MAX_PAIRS];
#endif
static void
load_dialog_colors (void) load_dialog_colors (void)
{ {
dialog_colors [0] = COLOR_NORMAL; dialog_colors [0] = COLOR_NORMAL;
@ -294,183 +150,19 @@ load_dialog_colors (void)
alarm_colors [3] = ERROR_HOT_FOCUS; alarm_colors [3] = ERROR_HOT_FOCUS;
} }
void init_colors (void)
{
size_t i;
int hascolors;
/* FIXME: if S-Lang is used, this function must be called regardless
of whether we are interested in its result */
hascolors = has_colors ();
if (!disable_colors && hascolors){
use_colors = 1;
}
if (use_colors){
start_color ();
#ifndef HAVE_SLANG
use_default_colors ();
#endif /* !HAVE_SLANG */
configure_colors ();
#ifndef HAVE_SLANG
if (ELEMENTS (color_map) > MAX_PAIRS){
/* This message should only be seen by the developers */
fprintf (stderr,
"Too many defined colors, resize MAX_PAIRS on color.c");
exit (1);
}
#endif /* !HAVE_SLANG */
if (use_colors) {
#ifdef HAVE_SLANG
/*
* We are relying on undocumented feature of
* S-Lang to make COLOR_PAIR(DEFAULT_COLOR_INDEX)
* the default fg/bg of the terminal.
* Hopefully, future versions of S-Lang will
* document this feature.
*/
SLtt_set_color (DEFAULT_COLOR_INDEX, NULL, (char*)"default", (char*)"default");
#else
/* Use default terminal colors */
mc_init_pair (DEFAULT_COLOR_INDEX, -1, -1);
#endif /* !HAVE_SLANG */
}
for (i = 0; i < ELEMENTS (color_map); i++){
if (!color_map [i].name)
continue;
mc_init_pair (i+1, color_map_fg(i), color_map_bg(i));
#ifndef HAVE_SLANG
/*
* ncurses doesn't remember bold attribute in the color pairs,
* so we should keep track of it in a separate array.
*/
attr_pairs [i+1] = color_map [i].fg & A_BOLD;
#endif /* !HAVE_SLANG */
}
}
load_dialog_colors ();
}
/* Functions necessary to implement syntax highlighting */ /* Functions necessary to implement syntax highlighting */
struct colors_avail c;
int max_index = 0;
static int max_index = 0; int
static int
alloc_color_pair (CTYPE foreground, CTYPE background) alloc_color_pair (CTYPE foreground, CTYPE background)
{ {
mc_init_pair (++max_index, foreground, background); mc_init_pair (++max_index, foreground, background);
return max_index; return max_index;
} }
static struct colors_avail {
struct colors_avail *next;
char *fg, *bg;
int index;
} c = { 0, 0, 0, 0 };
#ifdef HAVE_SLANG
void void
mc_init_pair (int index, CTYPE foreground, CTYPE background) tty_colors_done (void)
{
if (!background)
background = "default";
if (!foreground)
foreground = "default";
SLtt_set_color (index, (char*)"", (char *) foreground, (char *) background);
if (index > max_index)
max_index = index;
}
int
try_alloc_color_pair (const char *fg, const char *bg)
{
struct colors_avail *p = &c;
c.index = EDITOR_NORMAL_COLOR_INDEX;
for (;;) {
if (((fg && p->fg) ? !strcmp (fg, p->fg) : fg == p->fg) != 0
&& ((bg && p->bg) ? !strcmp (bg, p->bg) : bg == p->bg) != 0)
return p->index;
if (!p->next)
break;
p = p->next;
}
p->next = g_new (struct colors_avail, 1);
p = p->next;
p->next = 0;
p->fg = fg ? g_strdup (fg) : 0;
p->bg = bg ? g_strdup (bg) : 0;
if (!fg)
/* Index in color_map array = COLOR_INDEX - 1 */
fg = color_map[EDITOR_NORMAL_COLOR_INDEX - 1].fg;
if (!bg)
bg = color_map[EDITOR_NORMAL_COLOR_INDEX - 1].bg;
p->index = alloc_color_pair (fg, bg);
return p->index;
}
#else /* !HAVE_SLANG */
void
mc_init_pair (int index, CTYPE foreground, CTYPE background)
{
init_pair (index, foreground, background == 0 ? -1 : background);
if (index > max_index)
max_index = index;
}
int
try_alloc_color_pair (const char *fg, const char *bg)
{
int fg_index, bg_index;
int bold_attr;
struct colors_avail *p = &c;
c.index = EDITOR_NORMAL_COLOR_INDEX;
for (;;) {
if (((fg && p->fg) ? !strcmp (fg, p->fg) : fg == p->fg) != 0
&& ((bg && p->bg) ? !strcmp (bg, p->bg) : bg == p->bg) != 0)
return p->index;
if (!p->next)
break;
p = p->next;
}
p->next = g_new (struct colors_avail, 1);
p = p->next;
p->next = 0;
p->fg = fg ? g_strdup (fg) : 0;
p->bg = bg ? g_strdup (bg) : 0;
if (!fg)
/* Index in color_map array = COLOR_INDEX - 1 */
fg_index = color_map[EDITOR_NORMAL_COLOR_INDEX - 1].fg;
else
get_color (fg, &fg_index);
if (!bg)
bg_index = color_map[EDITOR_NORMAL_COLOR_INDEX - 1].bg;
else
get_color (bg, &bg_index);
bold_attr = fg_index & A_BOLD;
fg_index = fg_index & COLOR_WHITE;
bg_index = bg_index & COLOR_WHITE;
p->index = alloc_color_pair (fg_index, bg_index);
attr_pairs [p->index] = bold_attr;
return p->index;
}
#endif /* !HAVE_SLANG */
void
done_colors (void)
{ {
struct colors_avail *p, *next; struct colors_avail *p, *next;
@ -483,3 +175,8 @@ done_colors (void)
c.next = NULL; c.next = NULL;
} }
gboolean
tty_use_colors (void)
{
return use_colors;
}

View File

@ -6,30 +6,21 @@
#ifndef MC_COLOR_H #ifndef MC_COLOR_H
#define MC_COLOR_H #define MC_COLOR_H
extern int use_colors;
extern int disable_colors;
extern int attr_pairs [];
#ifdef HAVE_SLANG #ifdef HAVE_SLANG
# define MY_COLOR_PAIR(x) COLOR_PAIR(x) # include "../../src/tty/color-slang.h"
#else #else
# define MY_COLOR_PAIR(x) (COLOR_PAIR(x) | attr_pairs [x]) # include "../../src/tty/color-ncurses.h"
#endif #endif
#define IF_COLOR(co,bw) (use_colors ? MY_COLOR_PAIR(co) : bw) extern int use_colors;
extern int disable_colors;
/* Beware! When using Slang with color, not all the indexes are free. /* Beware! When using Slang with color, not all the indexes are free.
See myslang.h (A_*) */ See myslang.h (A_*) */
#define NORMAL_COLOR IF_COLOR (1, 0) #define NORMAL_COLOR IF_COLOR (1, 0)
#define SELECTED_COLOR IF_COLOR (2, A_REVERSE) #define SELECTED_COLOR IF_COLOR (2, A_REVERSE)
#define MARKED_COLOR IF_COLOR (3, A_BOLD) #define MARKED_COLOR IF_COLOR (3, A_BOLD)
/* MARKED_SELECTED_COLOR is screen library specific */
#ifdef HAVE_SLANG
#define MARKED_SELECTED_COLOR IF_COLOR (4, (SLtt_Use_Ansi_Colors ? A_BOLD_REVERSE : A_REVERSE | A_BOLD))
#else
#define MARKED_SELECTED_COLOR IF_COLOR (4, A_REVERSE | A_BOLD)
#endif
#define ERROR_COLOR IF_COLOR (5, A_BOLD) #define ERROR_COLOR IF_COLOR (5, A_BOLD)
#define MENU_ENTRY_COLOR IF_COLOR (6, A_REVERSE) #define MENU_ENTRY_COLOR IF_COLOR (6, A_REVERSE)
#define REVERSE_COLOR IF_COLOR (7, A_REVERSE) #define REVERSE_COLOR IF_COLOR (7, A_REVERSE)
@ -93,15 +84,8 @@ extern int alarm_colors[4];
#define ERROR_HOT_NORMAL IF_COLOR (39, 0) #define ERROR_HOT_NORMAL IF_COLOR (39, 0)
#define ERROR_HOT_FOCUS IF_COLOR (40, 0) #define ERROR_HOT_FOCUS IF_COLOR (40, 0)
#ifdef HAVE_SLANG
# define CTYPE const char *
#else
# define CTYPE int
#endif
void init_colors (void); void init_colors (void);
void done_colors (void); void done_colors (void);
void mc_init_pair (int index, CTYPE foreground, CTYPE background);
int try_alloc_color_pair (const char *fg, const char *bg); int try_alloc_color_pair (const char *fg, const char *bg);
#endif #endif /* MC_COLOR_H */

View File

@ -25,7 +25,6 @@
#include <config.h> #include <config.h>
#include <stdio.h> #include <stdio.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>

View File

@ -1,124 +0,0 @@
/** \file myslang.h
* \brief Header: slang wrapper module
*/
#ifndef MC_MYSLANG_H
#define MC_MYSLANG_H
#ifdef HAVE_SLANG_SLANG_H
# include <slang/slang.h>
#else
# include <slang.h>
#endif /* HAVE_SLANG_SLANG_H */
enum {
KEY_BACKSPACE = 400,
KEY_END, KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT,
KEY_HOME, KEY_A1, KEY_C1, KEY_NPAGE, KEY_PPAGE, KEY_IC,
KEY_ENTER, KEY_DC, KEY_SCANCEL, KEY_BTAB
};
#define KEY_F(x) (1000+x)
#define ACS_VLINE SLSMG_VLINE_CHAR
#define ACS_HLINE SLSMG_HLINE_CHAR
#define ACS_LTEE SLSMG_LTEE_CHAR
#define ACS_RTEE SLSMG_RTEE_CHAR
#define ACS_ULCORNER SLSMG_ULCORN_CHAR
#define ACS_LLCORNER SLSMG_LLCORN_CHAR
#define ACS_URCORNER SLSMG_URCORN_CHAR
#define ACS_LRCORNER SLSMG_LRCORN_CHAR
#define acs() SLsmg_set_char_set(1)
#define noacs() SLsmg_set_char_set (0)
#define baudrate() SLang_TT_Baud_Rate
enum {
COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW, COLOR_BLUE,
COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE
};
/* When using Slang with color, we have all the indexes free but
* those defined here (A_BOLD, A_UNDERLINE, A_REVERSE, A_BOLD_REVERSE)
*/
#define A_BOLD 0x40
#define A_UNDERLINE 0x40
#define A_REVERSE 0x20
#define A_BOLD_REVERSE 0x21
#ifndef A_NORMAL
# define A_NORMAL 0x00
#endif
#define COLOR_PAIR(x) x
#ifndef TRUE
# define TRUE 1
# define FALSE 0
#endif
void slang_set_raw_mode (void);
#define doupdate()
#define raw() slang_set_raw_mode()
#define noraw()
#define nodelay(x,val) set_slang_delay(val)
#define noecho()
#define beep() SLtt_beep ()
#define keypad(scr,value) slang_keypad (value)
#define ungetch(x) SLang_ungetkey(x)
#define start_color()
#define touchwin(x) SLsmg_touch_lines(0, LINES)
#define reset_shell_mode() slang_shell_mode()
#define reset_prog_mode() slang_prog_mode()
#define flushinp()
void slint_goto (int y, int x);
void attrset (int color);
void set_slang_delay (int);
void slang_init (void);
void slang_prog_mode (void);
void hline (int ch, int len);
void vline (int ch, int len);
int getch (void);
void slang_keypad (int set);
void slang_shell_mode (void);
void slang_shutdown (void);
int has_colors (void);
#define move(x, y) SLsmg_gotorc(x, y)
#define getyx(stdscr, row, col) \
do { \
row = SLsmg_get_row(); \
col = SLsmg_get_column(); \
} while (0)
#define printw SLsmg_printf
#define COLS SLtt_Screen_Cols
#define LINES SLtt_Screen_Rows
#define standend() SLsmg_normal_video()
#ifdef UTF8
/*
* Patched S-Lang in Red Hat 8.0 expects wchar_t as the argument to addch()
* Avoid conversion by using SLsmg_write_nchars(), which takes char*
*/
#undef addch
static inline void
mc_addch (char c)
{
SLsmg_write_nchars (&c, 1);
}
#define addch(c) mc_addch(c)
#else
#define addch(c) SLsmg_write_char(c)
#endif
#define addstr(s) SLsmg_write_string(str_unconst(s))
#define refresh() SLsmg_refresh()
#define endwin() SLsmg_reset_smg()
#define SLsmg_draw_double_box(r,c,dr,dc) SLsmg_draw_box ((r), (c), (dr), (dc))
#endif

View File

@ -25,7 +25,6 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>

103
src/tty/tty-ncurses.c Normal file
View File

@ -0,0 +1,103 @@
/** \file
* \brief Source: NCurses-based tty layer of Midnight-commander
*/
#include <config.h>
#include <stdlib.h>
#include <stdarg.h>
#include "../../src/global.h"
#ifndef WANT_TERM_H
# define WANT_TERM_H
#endif
#include "../../src/tty/color-ncurses.h"
#include "../../src/tty/tty-ncurses.h"
#include "../../src/background.h" /* we_are_background */
#include "../../src/strutil.h" /* str_term_form */
#include "../../src/util.h" /* str_unconst */
/* include at last !!! */
#ifdef WANT_TERM_H
# include <term.h>
#endif /* WANT_TERM_H*/
/*** global variables **************************************************/
/*** file scope macro definitions **************************************/
/*** global variables **************************************************/
/*** file scope type declarations **************************************/
/*** file scope variables **********************************************/
/*** file scope functions **********************************************/
/*** public functions **************************************************/
void
tty_lowlevel_setcolor (int color)
{
attrset (MY_COLOR_PAIR (color));
}
void
tty_gotoyx (int y, int x)
{
move (y, x);
}
void
tty_getyx (int *py, int *px)
{
getyx (stdscr, *py, *px);
}
void
tty_print_char (int c)
{
addch (c);
}
void
tty_print_alt_char (int c)
{
addch (c);
}
void
tty_print_string(const char *s)
{
addstr (str_term_form (s));
}
void
tty_printf (const char *fmt, ...)
{
va_list args;
va_start (args, fmt);
vw_printw (stdscr, fmt, args);
va_end (args);
}
char *
tty_tgetstr (const char *cap)
{
char *unused = NULL;
return tgetstr (str_unconst (cap), &unused);
}
void
mc_refresh (void)
{
#ifdef WITH_BACKGROUND
if (!we_are_background)
#endif /* WITH_BACKGROUND */
refresh ();
}

25
src/tty/tty-ncurses.h Normal file
View File

@ -0,0 +1,25 @@
#ifndef MC_TTY_NCURSES_H
#define MC_TTY_NCURSES_H
#ifdef USE_NCURSES
# ifdef HAVE_NCURSES_CURSES_H
# include <ncurses/curses.h>
# elif HAVE_NCURSESW_CURSES_H
# include <ncursesw/curses.h>
# elif HAVE_NCURSES_H
# include <ncurses.h>
# else
# include <curses.h>
# endif
#endif /* USE_NCURSES */
#ifdef USE_NCURSESW
# include <ncursesw/curses.h>
#endif /* USE_NCURSESW */
#define acs()
#define noacs()
#endif /* MC_TTY_NCURSES_H */

View File

@ -1,56 +1,36 @@
/* Slang interface to the Midnight Commander
This emulates some features of ncurses on top of slang
Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, /** \file
2005, 2007 Free Software Foundation, Inc. * \brief Source: S-Lang-based tty layer of Midnight Commander
Author Miguel de Icaza
Norbert Warmuth
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
/** \file slint.c
* \brief Source: slang %interface to the Midnight Commander
* \warning This module will be removed soon
*/ */
#include <config.h> #include <config.h>
#include <signal.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#ifdef HAVE_TERMIOS_H #ifdef HAVE_TERMIOS_H
#include <termios.h> #include <termios.h>
#endif #endif
#include <unistd.h> #include <unistd.h>
#include <sys/types.h> /* size_t */
#include "../../src/global.h" #include "../../src/global.h"
#include "../../src/tty/tty.h" #include "../../src/tty/tty-slang.h" /* mc-init_pair */
#include "../../src/tty/color.h" #include "../../src/tty/color.h"
#include "../../src/tty/mouse.h" /* Gpm_Event is required in key.h */ #include "../../src/tty/mouse.h" /* Gpm_Event is required in key.h */
#include "../../src/tty/key.h" /* define_sequence */ #include "../../src/tty/key.h" /* define_sequence */
#include "../../src/tty/win.h" /* do_exit_ca_mode */ #include "../../src/tty/win.h" /* do_exit_ca_mode */
#include "../../src/background.h" /* we_are_background */
#include "../../src/util.h" /* str_unconst */
#include "../../src/strutil.h" /* str_term_form */
#include "../../src/main.h" /* extern: force_colors */ #include "../../src/main.h" /* extern: force_colors */
#include "../../src/setup.h" #include "../../src/setup.h"
#include "../../src/background.h" /* we_are_background */
#ifdef HAVE_SLANG /*** global variables **************************************************/
/*** file scope macro definitions **************************************/
/* Taken from S-Lang's slutty.c */ /* Taken from S-Lang's slutty.c */
#ifdef ultrix /* Ultrix gets _POSIX_VDISABLE wrong! */ #ifdef ultrix /* Ultrix gets _POSIX_VDISABLE wrong! */
@ -61,12 +41,16 @@
# else # else
# define NULL_VALUE 255 # define NULL_VALUE 255
# endif # endif
#endif #endif /* ultrix */
#ifndef SA_RESTART #ifndef SA_RESTART
# define SA_RESTART 0 # define SA_RESTART 0
#endif #endif
/*** file scope type declarations **************************************/
/*** file scope variables **********************************************/
/* Various saved termios settings that we control here */ /* Various saved termios settings that we control here */
static struct termios boot_mode; static struct termios boot_mode;
static struct termios new_mode; static struct termios new_mode;
@ -74,334 +58,6 @@ static struct termios new_mode;
/* Controls whether we should wait for input in getch */ /* Controls whether we should wait for input in getch */
static int no_slang_delay; static int no_slang_delay;
/* Forward declarations */
static void load_terminfo_keys (void);
#ifndef HAVE_SLANG_PRIVATE
/* Private interfaces have been stripped, so we cannot use them */
#define SLang_getkey2() SLang_getkey()
#define SLang_input_pending2(s) SLang_input_pending(s)
#else
/* Copied from ../slang/slgetkey.c, removed the DEC_8Bit_HACK. */
extern unsigned char SLang_Input_Buffer [];
#if SLANG_VERSION >= 10000
extern unsigned int _SLsys_getkey (void);
extern int _SLsys_input_pending (int);
#else
extern unsigned int SLsys_getkey (void);
extern int SLsys_input_pending (int);
#endif
static unsigned int SLang_getkey2 (void)
{
unsigned int imax;
unsigned int ch;
if (SLang_Input_Buffer_Len)
{
ch = (unsigned int) *SLang_Input_Buffer;
SLang_Input_Buffer_Len--;
imax = SLang_Input_Buffer_Len;
memmove ((char *) SLang_Input_Buffer,
(char *) (SLang_Input_Buffer + 1), imax);
return(ch);
}
#if SLANG_VERSION >= 10000
else return(_SLsys_getkey ());
#else
else return(SLsys_getkey());
#endif
}
static int SLang_input_pending2 (int tsecs)
{
int n, i;
unsigned char c;
if (SLang_Input_Buffer_Len) return (int) SLang_Input_Buffer_Len;
#if SLANG_VERSION >= 10000
n = _SLsys_input_pending (tsecs);
#else
n = SLsys_input_pending (tsecs);
#endif
if (n <= 0) return 0;
i = SLang_getkey2 ();
if (i == SLANG_GETKEY_ERROR)
return 0; /* don't put crippled error codes into the input buffer */
c = (unsigned char)i;
SLang_ungetkey_string (&c, 1);
return n;
}
#endif /* HAVE_SLANG_PRIVATE */
/* Only done the first time */
void
slang_init (void)
{
SLtt_get_terminfo ();
#if SLANG_VERSION >= 20000
SLutf8_enable (-1);
#endif
/*
* If the terminal in not in terminfo but begins with a well-known
* string such as "linux" or "xterm" S-Lang will go on, but the
* terminal size and several other variables won't be initialized
* (as of S-Lang 1.4.4). Detect it and abort. Also detect extremely
* small, large and negative screen dimensions.
*/
if ((COLS < 10) || (LINES < 5) ||
(SLang_Version < 10407 && (COLS > 255 || LINES > 255)) ||
(SLang_Version >= 10407 && (COLS > 512 || LINES > 512))) {
fprintf (stderr,
_("Screen size %dx%d is not supported.\n"
"Check the TERM environment variable.\n"),
COLS, LINES);
exit (1);
}
tcgetattr (fileno (stdin), &boot_mode);
/* 255 = ignore abort char; XCTRL('g') for abort char = ^g */
SLang_init_tty (XCTRL('c'), 1, 0);
/* If SLang uses fileno(stderr) for terminal input MC will hang
if we call SLang_getkey between calls to open_error_pipe and
close_error_pipe, e.g. when we do a growing view of an gzipped
file. */
if (SLang_TT_Read_FD == fileno (stderr))
SLang_TT_Read_FD = fileno (stdin);
if (force_ugly_line_drawing)
SLtt_Has_Alt_Charset = 0;
if (tcgetattr (SLang_TT_Read_FD, &new_mode) == 0) {
#ifdef VDSUSP
new_mode.c_cc[VDSUSP] = NULL_VALUE; /* to ignore ^Y */
#endif
#ifdef VLNEXT
new_mode.c_cc[VLNEXT] = NULL_VALUE; /* to ignore ^V */
#endif
tcsetattr (SLang_TT_Read_FD, TCSADRAIN, &new_mode);
}
slang_prog_mode ();
load_terminfo_keys ();
SLtt_Blink_Mode = 0;
}
void
slang_set_raw_mode (void)
{
tcsetattr (SLang_TT_Read_FD, TCSANOW, &new_mode);
}
/* Done each time we come back from done mode */
void
slang_prog_mode (void)
{
tcsetattr (SLang_TT_Read_FD, TCSANOW, &new_mode);
SLsmg_init_smg ();
SLsmg_touch_lines (0, LINES);
}
/* Called each time we want to shutdown slang screen manager */
void
slang_shell_mode (void)
{
tcsetattr (SLang_TT_Read_FD, TCSANOW, &boot_mode);
}
void
slang_shutdown (void)
{
char *op_cap;
slang_shell_mode ();
do_exit_ca_mode ();
SLang_reset_tty ();
/* Load the op capability to reset the colors to those that were
* active when the program was started up
*/
op_cap = SLtt_tgetstr ((char*)"op");
if (op_cap){
fputs (op_cap, stdout);
fflush (stdout);
}
}
/* HP Terminals have capabilities (pfkey, pfloc, pfx) to program function keys.
elm 2.4pl15 invoked with the -K option utilizes these softkeys and the
consequence is that function keys don't work in MC sometimes.
Unfortunately I don't now the one and only escape sequence to turn off
softkeys (elm uses three different capabilities to turn on softkeys and two
capabilities to turn them off).
Among other things elm uses the pair we already use in slang_keypad. That's
the reason why I call slang_reset_softkeys from slang_keypad. In lack of
something better the softkeys are programmed to their defaults from the
termcap/terminfo database.
The escape sequence to program the softkeys is taken from elm and it is
hardcoded because neither slang nor ncurses 4.1 know how to 'printf' this
sequence. -- Norbert
*/
static void
slang_reset_softkeys (void)
{
int key;
char *send;
static const char display[] = " ";
char tmp[BUF_SMALL];
for (key = 1; key < 9; key++) {
g_snprintf (tmp, sizeof (tmp), "k%d", key);
send = (char *) SLtt_tgetstr (tmp);
if (send) {
g_snprintf (tmp, sizeof (tmp), "\033&f%dk%dd%dL%s%s", key,
(int) (sizeof (display) - 1), (int) strlen (send),
display, send);
SLtt_write_string (tmp);
}
}
}
/* keypad routines */
void
slang_keypad (int set)
{
const char *keypad_string;
extern int reset_hp_softkeys;
keypad_string = SLtt_tgetstr ((char*)(set ? "ks" : "ke"));
if (keypad_string)
SLtt_write_string ((char*)keypad_string);
if (set && reset_hp_softkeys)
slang_reset_softkeys ();
}
void
set_slang_delay (int v)
{
no_slang_delay = v;
}
void
hline (int ch, int len)
{
int last_x, last_y;
last_x = SLsmg_get_column ();
last_y = SLsmg_get_row ();
if (ch == 0)
ch = ACS_HLINE;
if (ch == ACS_HLINE){
SLsmg_draw_hline (len);
} else {
while (len--)
addch (ch);
}
move (last_y, last_x);
}
void
vline (int character, int len)
{
(void) character;
if (!slow_terminal){
SLsmg_draw_vline (len);
} else {
int last_x, last_y, pos = 0;
last_x = SLsmg_get_column ();
last_y = SLsmg_get_row ();
while (len--){
move (last_y + pos++, last_x);
addch (' ');
}
move (last_x, last_y);
}
}
int has_colors (void)
{
const char *terminal = getenv ("TERM");
char *cts = color_terminal_string, *s;
size_t i;
if (force_colors)
SLtt_Use_Ansi_Colors = 1;
if (NULL != getenv ("COLORTERM"))
SLtt_Use_Ansi_Colors = 1;
/* We want to allow overwriding */
if (!disable_colors){
/* check color_terminal_string */
if (*cts)
{
while (*cts)
{
while (*cts == ' ' || *cts == '\t') cts++;
s = cts;
i = 0;
while (*cts && *cts != ',')
{
cts++;
i++;
}
if (i && i == strlen(terminal) && strncmp(s, terminal, i) == 0)
SLtt_Use_Ansi_Colors = 1;
if (*cts == ',') cts++;
}
}
}
/* Setup emulated colors */
if (SLtt_Use_Ansi_Colors){
if (use_colors){
mc_init_pair (A_REVERSE, "black", "white");
mc_init_pair (A_BOLD, "white", "black");
} else {
mc_init_pair (A_REVERSE, "black", "lightgray");
mc_init_pair (A_BOLD, "white", "black");
mc_init_pair (A_BOLD_REVERSE, "white", "lightgray");
}
} else {
SLtt_set_mono (A_BOLD, NULL, SLTT_BOLD_MASK);
SLtt_set_mono (A_REVERSE, NULL, SLTT_REV_MASK);
SLtt_set_mono (A_BOLD|A_REVERSE, NULL, SLTT_BOLD_MASK | SLTT_REV_MASK);
}
return SLtt_Use_Ansi_Colors;
}
void
attrset (int color)
{
if (!SLtt_Use_Ansi_Colors){
SLsmg_set_color (color);
return;
}
if (color & A_BOLD){
if (color == A_BOLD)
SLsmg_set_color (A_BOLD);
else
SLsmg_set_color ((color & (~A_BOLD)) + 8);
return;
}
if (color == A_REVERSE)
SLsmg_set_color (A_REVERSE);
else
SLsmg_set_color (color);
}
/* This table describes which capabilities we want and which values we /* This table describes which capabilities we want and which values we
* assign to them. * assign to them.
*/ */
@ -441,16 +97,111 @@ static const struct {
{ KEY_BACKSPACE, "kb" }, { KEY_BACKSPACE, "kb" },
{ KEY_HOME, "kh" }, { KEY_HOME, "kh" },
{ KEY_END, "@7" }, { KEY_END, "@7" },
{ 0, 0} { 0, NULL }
}; };
/*** file scope functions **********************************************/
#ifndef HAVE_SLANG_PRIVATE
/* Private interfaces have been stripped, so we cannot use them */
# define SLang_getkey2() SLang_getkey ()
# define SLang_input_pending2(s) SLang_input_pending (s)
#else
static unsigned int
SLang_getkey2 (void)
{
if (SLang_Input_Buffer_Len) {
unsigned int ch;
unsigned int imax;
ch = (unsigned int) *SLang_Input_Buffer;
SLang_Input_Buffer_Len--;
imax = SLang_Input_Buffer_Len;
memmove ((char *) SLang_Input_Buffer,
(char *) (SLang_Input_Buffer + 1), imax);
return ch;
}
#if SLANG_VERSION >= 10000
return _SLsys_getkey ();
#else
return SLsys_getkey();
#endif
}
static int
SLang_input_pending2 (int tsecs)
{
int n, i;
unsigned char c;
if (SLang_Input_Buffer_Len)
return (int) SLang_Input_Buffer_Len;
#if SLANG_VERSION >= 10000
n = _SLsys_input_pending (tsecs);
#else
n = SLsys_input_pending (tsecs);
#endif
if (n <= 0)
return 0;
i = SLang_getkey2 ();
if (i == SLANG_GETKEY_ERROR)
return 0; /* don't put crippled error codes into the input buffer */
c = (unsigned char) i;
SLang_ungetkey_string (&c, 1);
return n;
}
#endif /* HAVE_SLANG_PRIVATE */
/* HP Terminals have capabilities (pfkey, pfloc, pfx) to program function keys.
elm 2.4pl15 invoked with the -K option utilizes these softkeys and the
consequence is that function keys don't work in MC sometimes...
Unfortunately I don't now the one and only escape sequence to turn off.
softkeys (elm uses three different capabilities to turn on softkeys and two.
capabilities to turn them off)..
Among other things elm uses the pair we already use in slang_keypad. That's.
the reason why I call slang_reset_softkeys from slang_keypad. In lack of
something better the softkeys are programmed to their defaults from the
termcap/terminfo database.
The escape sequence to program the softkeys is taken from elm and it is.
hardcoded because neither slang nor ncurses 4.1 know how to 'printf' this.
sequence. -- Norbert
*/
static void
slang_reset_softkeys (void)
{
int key;
char *send;
static const char display[] = " ";
char tmp[BUF_SMALL];
for (key = 1; key < 9; key++) {
g_snprintf (tmp, sizeof (tmp), "k%d", key);
send = (char *) SLtt_tgetstr (tmp);
if (send != NULL) {
g_snprintf (tmp, sizeof (tmp), "\033&f%dk%dd%dL%s%s", key,
(int) (sizeof (display) - 1), (int) strlen (send),
display, send);
SLtt_write_string (tmp);
}
}
}
static void static void
do_define_key (int code, const char *strcap) do_define_key (int code, const char *strcap)
{ {
char *seq; char *seq;
seq = (char *) SLtt_tgetstr ((char *) strcap); seq = (char *) SLtt_tgetstr ((char *) strcap);
if (seq) if (seq != NULL)
define_sequence (code, seq, MCKEY_NOACTION); define_sequence (code, seq, MCKEY_NOACTION);
} }
@ -463,12 +214,245 @@ load_terminfo_keys (void)
do_define_key (key_table [i].key_code, key_table [i].key_name); do_define_key (key_table [i].key_code, key_table [i].key_name);
} }
/*** public functions **************************************************/
void
slang_init (void)
{
SLtt_get_terminfo ();
#if SLANG_VERSION >= 20000
SLutf8_enable (-1);
#endif
/*
* If the terminal in not in terminfo but begins with a well-known
* string such as "linux" or "xterm" S-Lang will go on, but the
* terminal size and several other variables won't be initialized
* (as of S-Lang 1.4.4). Detect it and abort. Also detect extremely
* small, large and negative screen dimensions.
*/
if ((COLS < 10) || (LINES < 5)
|| ((SLang_Version < 10407) && ((COLS > 255) || (LINES > 255)))
|| ((SLang_Version >= 10407) && ((COLS > 512) || (LINES > 512)))) {
fprintf (stderr,
_("Screen size %dx%d is not supported.\n"
"Check the TERM environment variable.\n"),
COLS, LINES);
exit (1);
}
tcgetattr (fileno (stdin), &boot_mode);
/* 255 = ignore abort char; XCTRL('g') for abort char = ^g */
SLang_init_tty (XCTRL('c'), 1, 0);
/* If SLang uses fileno(stderr) for terminal input MC will hang
if we call SLang_getkey between calls to open_error_pipe and
close_error_pipe, e.g. when we do a growing view of an gzipped
file. */
if (SLang_TT_Read_FD == fileno (stderr))
SLang_TT_Read_FD = fileno (stdin);
if (force_ugly_line_drawing)
SLtt_Has_Alt_Charset = 0;
if (tcgetattr (SLang_TT_Read_FD, &new_mode) == 0) {
#ifdef VDSUSP
new_mode.c_cc[VDSUSP] = NULL_VALUE; /* to ignore ^Y */
#endif
#ifdef VLNEXT
new_mode.c_cc[VLNEXT] = NULL_VALUE; /* to ignore ^V */
#endif
tcsetattr (SLang_TT_Read_FD, TCSADRAIN, &new_mode);
}
slang_prog_mode ();
load_terminfo_keys ();
SLtt_Blink_Mode = 0;
}
void
slang_set_raw_mode (void)
{
tcsetattr (SLang_TT_Read_FD, TCSANOW, &new_mode);
}
/* Done each time we come back from done mode */
void
slang_prog_mode (void)
{
tcsetattr (SLang_TT_Read_FD, TCSANOW, &new_mode);
SLsmg_init_smg ();
SLsmg_touch_lines (0, LINES);
}
/* Called each time we want to shutdown slang screen manager */
void
slang_shell_mode (void)
{
tcsetattr (SLang_TT_Read_FD, TCSANOW, &boot_mode);
}
void
slang_shutdown (void)
{
char *op_cap;
slang_shell_mode ();
do_exit_ca_mode ();
SLang_reset_tty ();
/* Load the op capability to reset the colors to those that were
* active when the program was started up
*/
op_cap = SLtt_tgetstr ((cagr *) "op");
if (op_cap != NULL) {
fputs (op_cap, stdout);
fflush (stdout);
}
}
/* keypad routines */
void
slang_keypad (int set)
{
const char *keypad_string;
extern int reset_hp_softkeys;
keypad_string = SLtt_tgetstr ((char *) (set ? "ks" : "ke"));
if (keypad_string != NULL)
SLtt_write_string ((char *) keypad_string);
if (set && reset_hp_softkeys)
slang_reset_softkeys ();
}
void
set_slang_delay (int v)
{
no_slang_delay = v;
}
void
hline (int ch, int len)
{
int last_x, last_y;
last_x = SLsmg_get_column ();
last_y = SLsmg_get_row ();
if (ch == 0)
ch = ACS_HLINE;
if (ch == ACS_HLINE)
SLsmg_draw_hline (len);
else
while (len--)
addch (ch);
SLsmg_gotorc (last_y, last_x);
}
void
vline (int character, int len)
{
(void) character;
if (!slow_terminal)
SLsmg_draw_vline (len);
else {
int last_x, last_y, pos = 0;
last_x = SLsmg_get_column ();
last_y = SLsmg_get_row ();
while (len--) {
move (last_y + pos++, last_x);
addch (' ');
}
SLsmg_gotorc (last_x, last_y);
}
}
int has_colors (void)
{
const char *terminal = getenv ("TERM");
char *cts = color_terminal_string;
char *s;
size_t i;
if (force_colors)
SLtt_Use_Ansi_Colors = 1;
if (getenv ("COLORTERM") != NULL)
SLtt_Use_Ansi_Colors = 1;
/* We want to allow overwriding */
if (!disable_colors) {
/* check color_terminal_string */
while (*cts != '\0') {
while (*cts == ' ' || *cts == '\t')
cts++;
s = cts;
i = 0;
while (*cts != '\0' && *cts != ',') {
cts++;
i++;
}
if (i != 0 && i == strlen (terminal)
&& strncmp (s, terminal, i) == 0)
SLtt_Use_Ansi_Colors = 1;
if (*cts == ',')
cts++;
}
}
/* Setup emulated colors */
if (SLtt_Use_Ansi_Colors) {
if (use_colors) {
mc_init_pair (A_REVERSE, "black", "white");
mc_init_pair (A_BOLD, "white", "black");
} else {
mc_init_pair (A_REVERSE, "black", "lightgray");
mc_init_pair (A_BOLD, "white", "black");
mc_init_pair (A_BOLD_REVERSE, "white", "lightgray");
}
} else {
SLtt_set_mono (A_BOLD, NULL, SLTT_BOLD_MASK);
SLtt_set_mono (A_REVERSE, NULL, SLTT_REV_MASK);
SLtt_set_mono (A_BOLD|A_REVERSE, NULL, SLTT_BOLD_MASK | SLTT_REV_MASK);
}
return SLtt_Use_Ansi_Colors;
}
void
attrset (int color)
{
if (!SLtt_Use_Ansi_Colors)
SLsmg_set_color (color);
else if ((color & A_BOLD) != 0) {
if (color == A_BOLD)
SLsmg_set_color (A_BOLD);
else
SLsmg_set_color ((color & (~A_BOLD)) + 8);
} else
SLsmg_set_color (color);
}
/* Set colorpair by index, don't interpret S-Lang "emulated attributes" */
void
tty_lowlevel_setcolor (int color)
{
SLsmg_set_color (color & 0x7F);
}
int int
getch (void) getch (void)
{ {
int c; int c;
if (no_slang_delay)
if (SLang_input_pending2 (0) == 0) if (no_slang_delay
&& (SLang_input_pending2 (0) == 0))
return -1; return -1;
c = SLang_getkey2 (); c = SLang_getkey2 ();
@ -478,9 +462,66 @@ getch (void)
"Assuming EOF on stdin and exiting\n"); "Assuming EOF on stdin and exiting\n");
exit (1); exit (1);
} }
return c; return c;
} }
#endif /* HAVE_SLANG */
void
tty_gotoyx (int y, int x)
{
SLsmg_gotorc (y, x);
}
void
tty_getyx (int *py, int *px)
{
*px = SLsmg_get_column ();
*py = SLsmg_get_row ();
}
void
tty_print_char (int c)
{
/* We cannot use SLsmg_write_char here because the Debian and Redhat
* people thought changing the API of an external project was fun,
* especially when it depends on the preprocessor symbol UTF8 being
* defined or not. Congratulations! At least, they left the API call
* for SLsmg_write_nchars as it has always been.
*/
char ch;
ch = c;
SLsmg_write_nchars(&ch, 1);
}
void
tty_print_alt_char (int c)
{
SLsmg_draw_object (SLsmg_get_row(), SLsmg_get_column(), c);
}
void
tty_print_string (const char *s)
{
SLsmg_write_string (str_unconst (str_term_form (s)));
}
void
tty_printf (const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
SLsmg_vprintf (str_unconst(fmt), args);
va_end (args);
}
char *
tty_tgetstr (const char *cap)
{
return SLtt_tgetstr (str_unconst (cap));
}
void void
mc_refresh (void) mc_refresh (void)
@ -488,5 +529,5 @@ mc_refresh (void)
#ifdef WITH_BACKGROUND #ifdef WITH_BACKGROUND
if (!we_are_background) if (!we_are_background)
#endif /* WITH_BACKGROUND */ #endif /* WITH_BACKGROUND */
refresh (); SLsmg_refresh ();
} }

126
src/tty/tty-slang.h Normal file
View File

@ -0,0 +1,126 @@
#ifndef MC_TTY_SLANG_H
#define MC_TTY_SLANG_H
#ifdef HAVE_SLANG_SLANG_H
# include <slang/slang.h>
#else
# include <slang.h>
#endif /* HAVE_SLANG_SLANG_H */
#include "../../src/util.h" /* str_unconst*/
enum {
KEY_BACKSPACE = 400,
KEY_END, KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT,
KEY_HOME, KEY_A1, KEY_C1, KEY_NPAGE, KEY_PPAGE, KEY_IC,
KEY_ENTER, KEY_DC, KEY_SCANCEL, KEY_BTAB
};
#define KEY_F(x) (1000 + x)
#define ACS_VLINE SLSMG_VLINE_CHAR
#define ACS_HLINE SLSMG_HLINE_CHAR
#define ACS_LTEE SLSMG_LTEE_CHAR
#define ACS_RTEE SLSMG_RTEE_CHAR
#define ACS_ULCORNER SLSMG_ULCORN_CHAR
#define ACS_LLCORNER SLSMG_LLCORN_CHAR
#define ACS_URCORNER SLSMG_URCORN_CHAR
#define ACS_LRCORNER SLSMG_LRCORN_CHAR
#define acs() SLsmg_set_char_set (1)
#define noacs() SLsmg_set_char_set (0)
#define baudrate() SLang_TT_Baud_Rate
enum {
COLOR_BLACK = 0,
COLOR_RED,
COLOR_GREEN,
COLOR_YELLOW,
COLOR_BLUE,
COLOR_MAGENTA,
COLOR_CYAN,
COLOR_WHITE
};
/* When using Slang with color, we have all the indexes free but
* those defined here (A_BOLD, A_UNDERLINE, A_REVERSE, A_BOLD_REVERSE)
*/
#define A_BOLD 0x40
#define A_UNDERLINE 0x40
#define A_REVERSE 0x20
#define A_BOLD_REVERSE 0x21
#ifndef A_NORMAL
# define A_NORMAL 0x00
#endif
#define COLOR_PAIR(x) x
#ifndef TRUE
# define TRUE 1
# define FALSE 0
#endif
void slang_set_raw_mode (void);
#define doupdate()
#define raw() slang_set_raw_mode ()
#define noraw()
#define nodelay(x, val) set_slang_delay (val)
#define noecho()
#define beep() SLtt_beep ()
#define keypad(scr, value) slang_keypad (value)
#define ungetch(x) SLang_ungetkey (x)
#define start_color()
#define touchwin(x) SLsmg_touch_lines (0, LINES)
#define reset_shell_mode() slang_shell_mode ()
#define reset_prog_mode() slang_prog_mode ()
#define flushinp()
void attrset (int color);
void set_slang_delay (int);
void slang_init (void);
void slang_prog_mode (void);
void hline (int ch, int len);
void vline (int ch, int len);
int getch (void);
void slang_keypad (int set);
void slang_shell_mode (void);
void slang_shutdown (void);
int has_colors (void);
#define move(y, x) SLsmg_gotorc (y, x)
#define getyx(stdscr, row, col) \
do { \
row = SLsmg_get_row(); \
col = SLsmg_get_column(); \
} while (0)
#define printw SLsmg_printf
#define COLS SLtt_Screen_Cols
#define LINES SLtt_Screen_Rows
#define standend() SLsmg_normal_video ()
#ifdef UTF8
/*
* Patched S-Lang in Red Hat 8.0 expects wchar_t as the argument to addch()
* Avoid conversion by using SLsmg_write_nchars(), which takes char*
*/
#undef addch
static inline void
mc_addch (char c)
{
SLsmg_write_nchars (&c, 1);
}
#define addch(c) mc_addch (c)
#else
#define addch(c) SLsmg_write_char (c)
#endif
#define addstr(s) SLsmg_write_string (str_unconst(s))
#define endwin() SLsmg_reset_smg ()
#define SLsmg_draw_double_box(r, c, dr, dc) SLsmg_draw_box ((r), (c), (dr), (dc))
#endif /* MC_TTY_SLANG_H */

View File

@ -35,24 +35,17 @@
#include "../../src/global.h" #include "../../src/global.h"
#include "../../src/tty/color.h"
#if defined(USE_NCURSES) || defined(USE_NCURSESW)
#define WANT_TERM_H
#endif
#include "../../src/tty/tty.h" #include "../../src/tty/tty.h"
#include "../../src/tty/color.h"
#include "../../src/main.h" /* for slow_terminal */ #include "../../src/main.h" /* for slow_terminal */
#include "../../src/strutil.h" #include "../../src/strutil.h"
#include "../../src/background.h" /* we_are_background */
/*** file scope macro definitions **************************************/
#ifndef HAVE_SLANG
# define acs()
# define noacs()
#endif
/*** global variables **************************************************/ /*** global variables **************************************************/
/*** file scope macro definitions **************************************/
/*** file scope type declarations **************************************/ /*** file scope type declarations **************************************/
/*** file scope variables **********************************************/ /*** file scope variables **********************************************/
@ -114,74 +107,12 @@ tty_got_interrupt(void)
return rv; return rv;
} }
extern void
tty_gotoyx(int y, int x)
{
#ifdef HAVE_SLANG
SLsmg_gotorc(y, x);
#else
move(y, x);
#endif
}
extern void
tty_getyx(int *py, int *px)
{
#ifdef HAVE_SLANG
*px = SLsmg_get_column();
*py = SLsmg_get_row();
#else
getyx(stdscr, *py, *px);
#endif
}
extern void extern void
tty_setcolor(int c) tty_setcolor(int c)
{ {
attrset(c); attrset(c);
} }
extern void
tty_print_char(int c)
{
#ifdef HAVE_SLANG
/* We cannot use SLsmg_write_char here because the Debian and Redhat
* people thought changing the API of an external project was fun,
* especially when it depends on the preprocessor symbol UTF8 being
* defined or not. Congratulations! At least, they left the API call
* for SLsmg_write_nchars as it has always been.
*/
char ch;
ch = c;
SLsmg_write_nchars(&ch, 1);
#else
addch(c);
#endif
}
extern void
tty_print_alt_char(int c)
{
#ifdef HAVE_SLANG
SLsmg_draw_object(SLsmg_get_row(), SLsmg_get_column(), c);
#else
acs();
addch(c);
noacs();
#endif
}
extern void
tty_print_string(const char *s)
{
#ifdef HAVE_SLANG
SLsmg_write_string (str_unconst (str_term_form (s)));
#else
addstr (str_term_form (s));
#endif
}
extern void extern void
tty_print_one_hline(void) tty_print_one_hline(void)
{ {
@ -221,30 +152,3 @@ tty_print_vline(int top, int left, int length)
tty_print_one_vline(); tty_print_one_vline();
} }
} }
extern void
tty_printf(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
#ifdef HAVE_SLANG
SLsmg_vprintf(str_unconst(fmt), args);
#else
vw_printw(stdscr, fmt, args);
#endif
va_end(args);
}
extern char *
tty_tgetstr (const char *cap)
{
#ifdef HAVE_SLANG
return SLtt_tgetstr (str_unconst (cap));
#else
{
char *unused = NULL;
return tgetstr (str_unconst (cap), &unused);
}
#endif
}

View File

@ -3,39 +3,20 @@
* \brief Header: %interface to the terminal controlling library * \brief Header: %interface to the terminal controlling library
* *
* This file is the %interface to the terminal controlling library: * This file is the %interface to the terminal controlling library:
* ncurses, slang or the built-in slang. It provides an additional * slang or ncurses. It provides an additional layer of abstraction
* layer of abstraction above the "real" libraries to keep the number * above the "real" libraries to keep the number of ifdefs in the other
* of ifdefs in the other files small. * files small.
*/ */
#ifndef MC_TTY_H #ifndef MC_TTY_H
#define MC_TTY_H #define MC_TTY_H
#include "../../src/global.h" /* include <glib.h> */
#ifdef HAVE_SLANG #ifdef HAVE_SLANG
# include "../../src/tty/myslang.h" # include "../../src/tty/tty-slang.h"
#endif
#ifdef USE_NCURSES
# ifdef HAVE_NCURSES_CURSES_H
# include <ncurses/curses.h>
# elif HAVE_NCURSESW_CURSES_H
# include <ncursesw/curses.h>
# elif HAVE_NCURSES_H
# include <ncurses.h>
#else #else
# include <curses.h> # include "../../src/tty/tty-ncurses.h"
# endif
#ifdef WANT_TERM_H
# include <term.h>
#endif /* WANT_TERM_H */
#endif /* USE_NCURSES */
#ifdef USE_NCURSESW
# include <ncursesw/curses.h>
#ifdef WANT_TERM_H
# include <term.h>
#endif
#endif #endif
/* {{{ Input }}} */ /* {{{ Input }}} */
@ -53,19 +34,20 @@ extern gboolean tty_got_interrupt(void);
While SLang provides such a feature, ncurses does not. While SLang provides such a feature, ncurses does not.
*/ */
extern void tty_gotoyx(int, int); extern void tty_gotoyx(int y, int x);
extern void tty_getyx(int *, int *); extern void tty_getyx(int *py, int *px);
extern void tty_setcolor(int); extern void tty_setcolor(int color);
extern void tty_lowlevel_setcolor(int color);
extern void tty_print_char(int); extern void tty_print_char(int c);
extern void tty_print_alt_char(int); extern void tty_print_alt_char(int c);
extern void tty_print_string(const char *); extern void tty_print_string(const char *s);
extern void tty_print_one_vline(void); extern void tty_print_one_vline(void);
extern void tty_print_one_hline(void); extern void tty_print_one_hline(void);
extern void tty_print_vline(int top, int left, int length); extern void tty_print_vline(int top, int left, int length);
extern void tty_print_hline(int top, int left, int length); extern void tty_print_hline(int top, int left, int length);
extern void tty_printf(const char *, ...); extern void tty_printf(const char *s, ...);
extern char *tty_tgetstr (const char *name); extern char *tty_tgetstr (const char *name);
@ -78,15 +60,10 @@ extern char *tty_tgetstr (const char *name);
#define one_hline() tty_print_one_hline() #define one_hline() tty_print_one_hline()
#define one_vline() tty_print_one_vline() #define one_vline() tty_print_one_vline()
#ifndef HAVE_SLANG
# define acs()
# define noacs()
#endif
#define KEY_KP_ADD 4001 #define KEY_KP_ADD 4001
#define KEY_KP_SUBTRACT 4002 #define KEY_KP_SUBTRACT 4002
#define KEY_KP_MULTIPLY 4003 #define KEY_KP_MULTIPLY 4003
void mc_refresh (void); void mc_refresh (void);
#endif #endif /* MC_TTY_H */

View File

@ -6,10 +6,13 @@
#ifndef MC_UTIL_H #ifndef MC_UTIL_H
#define MC_UTIL_H #define MC_UTIL_H
#include <sys/types.h> #include "global.h" /* include <glib.h> */
#include <assert.h>
#include <string.h> #include <string.h>
#include <assert.h>
#include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h>
/* Returns its argument as a "modifiable" string. This function is /* Returns its argument as a "modifiable" string. This function is
* intended to pass strings to legacy libraries that don't know yet * intended to pass strings to legacy libraries that don't know yet