mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-22 12:32:40 +03:00
Initial step to split NCurses- and SLang-based TTY layers.
This commit is contained in:
parent
389e5bf613
commit
ea0cb38b9e
@ -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])
|
||||||
|
@ -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 ) {
|
||||||
|
@ -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, ...)
|
||||||
|
@ -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
96
src/tty/color-internal.c
Normal 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
107
src/tty/color-internal.h
Normal 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
125
src/tty/color-ncurses.c
Normal 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
19
src/tty/color-ncurses.h
Normal 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
111
src/tty/color-slang.c
Normal 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
15
src/tty/color-slang.h
Normal 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 */
|
369
src/tty/color.c
369
src/tty/color.c
@ -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;
|
||||||
|
}
|
||||||
|
@ -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 */
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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
|
|
@ -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
103
src/tty/tty-ncurses.c
Normal 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
25
src/tty/tty-ncurses.h
Normal 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 */
|
@ -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
126
src/tty/tty-slang.h
Normal 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 */
|
104
src/tty/tty.c
104
src/tty/tty.c
@ -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
|
|
||||||
}
|
|
||||||
|
@ -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 */
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user