ncurses 5.7 - patch 20090822

+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
This commit is contained in:
Thomas E. Dickey 2009-08-23 01:14:12 +00:00
parent bbb7fd3729
commit 3f5a74a97c
8 changed files with 288 additions and 112 deletions

5
NEWS
View File

@ -25,7 +25,7 @@
-- sale, use or other dealings in this Software without prior written --
-- authorization. --
-------------------------------------------------------------------------------
-- $Id: NEWS,v 1.1421 2009/08/15 23:09:41 tom Exp $
-- $Id: NEWS,v 1.1422 2009/08/22 23:16:03 tom Exp $
-------------------------------------------------------------------------------
This is a log of changes that ncurses has gone through since Zeyd started
@ -45,6 +45,9 @@ See the AUTHORS file for the corresponding full names.
Changes through 1.9.9e did not credit all contributions;
it is not possible to add this information.
20090822
+ continue integrating "sp-funcs" by Juergen Pfeifer (incomplete).
20090815
+ correct use of terminfo capabilities for initializing soft-keys,
broken in 20090509 merging.

View File

@ -25,7 +25,7 @@
# use or other dealings in this Software without prior written #
# authorization. #
##############################################################################
# $Id: dist.mk,v 1.715 2009/08/10 20:48:14 tom Exp $
# $Id: dist.mk,v 1.716 2009/08/22 16:00:41 tom Exp $
# Makefile for creating ncurses distributions.
#
# This only needs to be used directly as a makefile by developers, but
@ -37,7 +37,7 @@ SHELL = /bin/sh
# These define the major/minor/patch versions of ncurses.
NCURSES_MAJOR = 5
NCURSES_MINOR = 7
NCURSES_PATCH = 20090815
NCURSES_PATCH = 20090822
# We don't append the patch to the version, since this only applies to releases
VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR)

View File

@ -1,5 +1,5 @@
/****************************************************************************
* Copyright (c) 1998-2007,2009 Free Software Foundation, Inc. *
* Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
@ -39,16 +39,33 @@
*/
#include <curses.priv.h>
#include <term.h>
#include <tic.h>
#ifndef CUR
#define CUR SP_TERMTYPE
#endif
MODULE_ID("$Id: lib_color.c,v 1.92 2009/06/06 20:26:16 tom Exp $")
MODULE_ID("$Id: lib_color.c,v 1.95 2009/08/22 19:04:36 tom Exp $")
#ifdef USE_TERM_DRIVER
#define CanChange InfoOf(SP_PARM).canchange
#define DefaultPalette InfoOf(SP_PARM).defaultPalette
#define HasColor InfoOf(SP_PARM).hascolor
#define InitColor InfoOf(SP_PARM).initcolor
#define MaxColors InfoOf(SP_PARM).maxcolors
#define MaxPairs InfoOf(SP_PARM).maxpairs
#define UseHlsPalette (DefaultPalette == _nc_hls_palette)
#else
#define CanChange can_change
#define DefaultPalette (hue_lightness_saturation ? hls_palette : cga_palette)
#define HasColor has_color
#define InitColor initialize_color
#define MaxColors max_colors
#define MaxPairs max_pairs
#define UseHlsPalette (hue_lightness_saturation)
#endif
#ifndef USE_TERM_DRIVER
/*
* These should be screen structure members. They need to be globals for
* historical reasons. So we assign them in start_color() and also in
@ -69,6 +86,7 @@ NCURSES_PUBLIC_VAR(COLORS) (void)
NCURSES_EXPORT_VAR(int) COLOR_PAIRS = 0;
NCURSES_EXPORT_VAR(int) COLORS = 0;
#endif
#endif /* !USE_TERM_DRIVER */
#define DATA(r,g,b) {r,g,b, 0,0,0, 0}
@ -76,7 +94,7 @@ NCURSES_EXPORT_VAR(int) COLORS = 0;
#define MAX_PALETTE 8
#define OkColorHi(n) (((n) < COLORS) && ((n) < max_colors))
#define OkColorHi(n) (((n) < COLORS) && ((n) < maxcolors))
#define InPalette(n) ((n) >= 0 && (n) < MAX_PALETTE)
/*
@ -111,6 +129,12 @@ static const color_t hls_palette[] =
DATA( 300, 50, 100), /* COLOR_CYAN */
DATA( 0, 50, 100), /* COLOR_WHITE */
};
#ifdef USE_TERM_DRIVER
NCURSES_EXPORT_VAR(const color_t*) _nc_cga_palette = cga_palette;
NCURSES_EXPORT_VAR(const color_t*) _nc_hls_palette = hls_palette;
#endif
/* *INDENT-ON* */
/*
@ -118,29 +142,30 @@ static const color_t hls_palette[] =
* that the index is within the limits of the table which we allocated.
*/
#define ValidPair(pair) \
((SP != 0) && (pair >= 0) && (pair < SP->_pair_limit) && SP->_coloron)
((SP_PARM != 0) && (pair >= 0) && (pair < SP_PARM->_pair_limit) && SP_PARM->_coloron)
#if NCURSES_EXT_FUNCS
/*
* These are called from _nc_do_color(), which in turn is called from
* vidattr - so we have to assume that SP may be null.
* vidattr - so we have to assume that sp may be null.
*/
static int
default_fg(void)
default_fg(NCURSES_SP_DCL0)
{
return (SP != 0) ? SP->_default_fg : COLOR_WHITE;
return (SP_PARM != 0) ? SP_PARM->_default_fg : COLOR_WHITE;
}
static int
default_bg(void)
default_bg(NCURSES_SP_DCL0)
{
return SP != 0 ? SP->_default_bg : COLOR_BLACK;
return SP_PARM != 0 ? SP_PARM->_default_bg : COLOR_BLACK;
}
#else
#define default_fg() COLOR_WHITE
#define default_bg() COLOR_BLACK
#define default_fg(sp) COLOR_WHITE
#define default_bg(sp) COLOR_BLACK
#endif
#ifndef USE_TERM_DRIVER
/*
* SVr4 curses is known to interchange color codes (1,4) and (3,6), possibly
* to maintain compatibility with a pre-ANSI scheme. The same scheme is
@ -157,10 +182,14 @@ toggled_colors(int c)
}
return c;
}
#endif
static void
set_background_color(NCURSES_SP_DCLx int bg, NCURSES_SP_OUTC outc)
{
#ifdef USE_TERM_DRIVER
CallDriver_3(SP_PARM, color, FALSE, bg, outc);
#else
if (set_a_background) {
TPUTS_TRACE("set_a_background");
NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
@ -172,11 +201,15 @@ set_background_color(NCURSES_SP_DCLx int bg, NCURSES_SP_OUTC outc)
TPARM_1(set_background, toggled_colors(bg)),
1, outc);
}
#endif
}
static void
set_foreground_color(NCURSES_SP_DCLx int fg, NCURSES_SP_OUTC outc)
{
#ifdef USE_TERM_DRIVER
CallDriver_3(SP_PARM, color, TRUE, fg, outc);
#else
if (set_a_foreground) {
TPUTS_TRACE("set_a_foreground");
NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
@ -188,21 +221,23 @@ set_foreground_color(NCURSES_SP_DCLx int fg, NCURSES_SP_OUTC outc)
TPARM_1(set_foreground, toggled_colors(fg)),
1, outc);
}
#endif
}
static void
init_color_table(NCURSES_SP_DCL0)
{
const color_t *tp;
const color_t *tp = DefaultPalette;
int n;
tp = (hue_lightness_saturation) ? hls_palette : cga_palette;
assert(tp != 0);
for (n = 0; n < COLORS; n++) {
if (InPalette(n)) {
SP_PARM->_color_table[n] = tp[n];
} else {
SP_PARM->_color_table[n] = tp[n % MAX_PALETTE];
if (hue_lightness_saturation) {
if (UseHlsPalette) {
SP_PARM->_color_table[n].green = 100;
} else {
if (SP_PARM->_color_table[n].red)
@ -222,6 +257,9 @@ init_color_table(NCURSES_SP_DCL0)
static bool
reset_color_pair(NCURSES_SP_DCL0)
{
#ifdef USE_TERM_DRIVER
return CallDriver(SP_PARM, rescol);
#else
bool result = FALSE;
if (orig_pair != 0) {
@ -230,6 +268,7 @@ reset_color_pair(NCURSES_SP_DCL0)
result = TRUE;
}
return result;
#endif
}
/*
@ -237,26 +276,31 @@ reset_color_pair(NCURSES_SP_DCL0)
* badly-written terminal descriptions than for the relatively rare case where
* someone has changed the color definitions.
*/
bool
NCURSES_SP_NAME(_nc_reset_colors) (NCURSES_SP_DCL0) {
NCURSES_EXPORT(bool)
NCURSES_SP_NAME(_nc_reset_colors) (NCURSES_SP_DCL0)
{
int result = FALSE;
T((T_CALLED("_nc_reset_colors()")));
T((T_CALLED("_nc_reset_colors(%p)"), SP_PARM));
if (SP_PARM->_color_defs > 0)
SP_PARM->_color_defs = -(SP_PARM->_color_defs);
if (reset_color_pair(NCURSES_SP_ARG))
result = TRUE;
#ifdef USE_TERM_DRIVER
result = CallDriver(SP_PARM, rescolors);
#else
if (orig_colors != 0) {
TPUTS_TRACE("orig_colors");
putp(orig_colors);
result = TRUE;
}
#endif
returnBool(result);
}
#if NCURSES_SP_FUNCS
bool
NCURSES_EXPORT(bool)
_nc_reset_colors(void)
{
return NCURSES_SP_NAME(_nc_reset_colors) (CURRENT_SCREEN);
@ -267,48 +311,49 @@ NCURSES_EXPORT(int)
NCURSES_SP_NAME(start_color) (NCURSES_SP_DCL0)
{
int result = ERR;
int maxpairs = 0, maxcolors = 0;
T((T_CALLED("start_color()")));
T((T_CALLED("start_color(%p)"), SP_PARM));
if (SP_PARM == 0) {
result = ERR;
} else if (SP_PARM->_coloron) {
result = OK;
} else {
maxpairs = MaxPairs;
maxcolors = MaxColors;
if (reset_color_pair(NCURSES_SP_ARG) != TRUE) {
set_foreground_color(NCURSES_SP_ARGx
default_fg(),
default_fg(NCURSES_SP_ARG),
NCURSES_SP_NAME(_nc_outch));
set_background_color(NCURSES_SP_ARGx
default_bg(),
default_bg(NCURSES_SP_ARG),
NCURSES_SP_NAME(_nc_outch));
}
if (max_pairs > 0 && max_colors > 0) {
SP_PARM->_pair_limit = max_pairs;
if (maxpairs > 0 && maxcolors > 0) {
SP_PARM->_pair_limit = maxpairs;
#if NCURSES_EXT_FUNCS
/*
* If using default colors, allocate extra space in table to
* allow for default-color as a component of a color-pair.
*/
SP_PARM->_pair_limit += (1 + (2 * max_colors));
SP_PARM->_pair_limit += (1 + (2 * maxcolors));
#endif
SP_PARM->_pair_count = max_pairs;
SP_PARM->_color_count = max_colors;
SP_PARM->_pair_count = maxpairs;
SP_PARM->_color_count = maxcolors;
#if !USE_REENTRANT
COLOR_PAIRS = max_pairs;
COLORS = max_colors;
COLOR_PAIRS = maxpairs;
COLORS = maxcolors;
#endif
SP_PARM->_color_pairs = TYPE_CALLOC(colorpair_t,
SP_PARM->_pair_limit);
SP_PARM->_color_pairs = TYPE_CALLOC(colorpair_t, SP_PARM->_pair_limit);
if (SP_PARM->_color_pairs != 0) {
SP_PARM->_color_table = TYPE_CALLOC(color_t, max_colors);
SP_PARM->_color_table = TYPE_CALLOC(color_t, maxcolors);
if (SP_PARM->_color_table != 0) {
SP_PARM->_color_pairs[0] = PAIR_OF(default_fg(),
default_bg());
SP_PARM->_color_pairs[0] = PAIR_OF(default_fg(NCURSES_SP_ARG),
default_bg(NCURSES_SP_ARG));
init_color_table(NCURSES_SP_ARG);
T(("started color: COLORS = %d, COLOR_PAIRS = %d",
@ -382,12 +427,15 @@ NCURSES_SP_NAME(init_pair) (NCURSES_SP_DCLx short pair, short f, short b)
{
colorpair_t result;
colorpair_t previous;
int maxcolors;
T((T_CALLED("init_pair(%d,%d,%d)"), pair, f, b));
T((T_CALLED("init_pair(%p,%d,%d,%d)"), SP_PARM, pair, f, b));
if (!ValidPair(pair))
returnCode(ERR);
maxcolors = MaxColors;
previous = SP_PARM->_color_pairs[pair];
#if NCURSES_EXT_FUNCS
if (SP_PARM->_default_color) {
@ -463,10 +511,10 @@ NCURSES_SP_NAME(init_pair) (NCURSES_SP_DCLx short pair, short f, short b)
&& previous != result) {
int y, x;
for (y = 0; y <= curscr->_maxy; y++) {
struct ldat *ptr = &(curscr->_line[y]);
for (y = 0; y <= CurScreen(SP_PARM)->_maxy; y++) {
struct ldat *ptr = &(CurScreen(SP_PARM)->_line[y]);
bool changed = FALSE;
for (x = 0; x <= curscr->_maxx; x++) {
for (x = 0; x <= CurScreen(SP_PARM)->_maxx; x++) {
if (GetPair(ptr->text[x]) == pair) {
/* Set the old cell to zero to ensure it will be
updated on the next doupdate() */
@ -476,15 +524,19 @@ NCURSES_SP_NAME(init_pair) (NCURSES_SP_DCLx short pair, short f, short b)
}
}
if (changed)
_nc_make_oldhash(y);
NCURSES_SP_NAME(_nc_make_oldhash) (NCURSES_SP_ARGx y);
}
}
SP_PARM->_color_pairs[pair] = result;
if (GET_SCREEN_PAIR(SP_PARM) == pair)
SET_SCREEN_PAIR(SP_PARM, (chtype) (~0)); /* force attribute update */
#ifdef USE_TERM_DRIVER
CallDriver_3(SP_PARM, initpair, pair, f, b);
#else
if (initialize_pair && InPalette(f) && InPalette(b)) {
const color_t *tp = hue_lightness_saturation ? hls_palette : cga_palette;
const color_t *tp = DefaultPalette;
TR(TRACE_ATTRS,
("initializing pair: pair = %d, fg=(%d,%d,%d), bg=(%d,%d,%d)",
@ -498,6 +550,7 @@ NCURSES_SP_NAME(init_pair) (NCURSES_SP_DCLx short pair, short f, short b)
tp[f].red, tp[f].green, tp[f].blue,
tp[b].red, tp[b].green, tp[b].blue));
}
#endif
returnCode(OK);
}
@ -517,11 +570,16 @@ NCURSES_SP_NAME(init_color) (NCURSES_SP_DCLx
short color, short r, short g, short b)
{
int result = ERR;
int maxcolors;
T((T_CALLED("init_color(%d,%d,%d,%d)"), color, r, g, b));
T((T_CALLED("init_color(%p,%d,%d,%d,%d)"), SP_PARM, color, r, g, b));
if (initialize_color != NULL
&& SP_PARM != 0
if (SP_PARM == 0)
returnCode(result);
maxcolors = MaxColors;
if (InitColor
&& SP_PARM->_coloron
&& (color >= 0 && OkColorHi(color))
&& (okRGB(r) && okRGB(g) && okRGB(b))) {
@ -531,7 +589,7 @@ NCURSES_SP_NAME(init_color) (NCURSES_SP_DCLx
SP_PARM->_color_table[color].g = g;
SP_PARM->_color_table[color].b = b;
if (hue_lightness_saturation) {
if (UseHlsPalette) {
rgb2hls(r, g, b,
&SP_PARM->_color_table[color].red,
&SP_PARM->_color_table[color].green,
@ -542,9 +600,14 @@ NCURSES_SP_NAME(init_color) (NCURSES_SP_DCLx
SP_PARM->_color_table[color].blue = b;
}
#ifdef USE_TERM_DRIVER
CallDriver_4(SP_PARM, initcolor, color, r, g, b);
#else
TPUTS_TRACE("initialize_color");
putp(TPARM_4(initialize_color, color, r, g, b));
#endif
SP_PARM->_color_defs = max(color + 1, SP_PARM->_color_defs);
result = OK;
}
returnCode(result);
@ -559,10 +622,10 @@ init_color(short color, short r, short g, short b)
#endif
NCURSES_EXPORT(bool)
NCURSES_SP_NAME(can_change_color) (NCURSES_SP_DCL0)
NCURSES_SP_NAME(can_change_color) (NCURSES_SP_DCL)
{
T((T_CALLED("can_change_color()")));
returnCode((can_change != 0) ? TRUE : FALSE);
T((T_CALLED("can_change_color(%p)"), SP_PARM));
returnCode((CanChange != 0) ? TRUE : FALSE);
}
#if NCURSES_SP_FUNCS
@ -576,13 +639,20 @@ can_change_color(void)
NCURSES_EXPORT(bool)
NCURSES_SP_NAME(has_colors) (NCURSES_SP_DCL0)
{
int code;
T((T_CALLED("has_colors()")));
returnCode((VALID_NUMERIC(max_colors) && VALID_NUMERIC(max_pairs)
&& (((set_foreground != NULL)
&& (set_background != NULL))
|| ((set_a_foreground != NULL)
&& (set_a_background != NULL))
|| set_color_pair)) ? TRUE : FALSE);
#ifdef USE_TERM_DRIVER
code = HasColor;
#else
code = ((VALID_NUMERIC(max_colors) && VALID_NUMERIC(max_pairs)
&& (((set_foreground != NULL)
&& (set_background != NULL))
|| ((set_a_foreground != NULL)
&& (set_a_background != NULL))
|| set_color_pair)) ? TRUE : FALSE);
#endif
returnCode(code);
}
#if NCURSES_SP_FUNCS
@ -594,13 +664,20 @@ has_colors(void)
#endif
NCURSES_EXPORT(int)
NCURSES_SP_NAME(color_content) (NCURSES_SP_DCLx short color, short *r,
short *g, short *b)
NCURSES_SP_NAME(color_content) (NCURSES_SP_DCLx
short color, short *r, short *g, short *b)
{
int result;
int result = ERR;
int maxcolors;
T((T_CALLED("color_content(%d,%p,%p,%p)"), color, r, g, b));
if (color < 0 || !OkColorHi(color) || SP_PARM == 0 || !SP_PARM->_coloron) {
T((T_CALLED("color_content(%p,%d,%p,%p,%p)"), SP_PARM, color, r, g, b));
if (SP_PARM == 0)
returnCode(result);
maxcolors = MaxColors;
if (color < 0 || !OkColorHi(color) || !SP_PARM->_coloron) {
result = ERR;
} else {
NCURSES_COLOR_T c_r = SP_PARM->_color_table[color].red;
@ -630,12 +707,12 @@ color_content(short color, short *r, short *g, short *b)
#endif
NCURSES_EXPORT(int)
NCURSES_SP_NAME(pair_content) (NCURSES_SP_DCLx short pair, short *f,
short *b)
NCURSES_SP_NAME(pair_content) (NCURSES_SP_DCLx
short pair, short *f, short *b)
{
int result;
T((T_CALLED("pair_content(%d,%p,%p)"), pair, f, b));
T((T_CALLED("pair_content(%p,%d,%p,%p)"), SP_PARM, pair, f, b));
if (!ValidPair(pair)) {
result = ERR;
@ -655,7 +732,7 @@ NCURSES_SP_NAME(pair_content) (NCURSES_SP_DCLx short pair, short *f,
if (b)
*b = bg;
TR(TRACE_ATTRS, ("...pair_content(%d,%d,%d)", pair, fg, bg));
TR(TRACE_ATTRS, ("...pair_content(%p,%d,%d,%d)", SP_PARM, pair, fg, bg));
result = OK;
}
returnCode(result);
@ -676,6 +753,9 @@ NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_DCLx
bool reverse,
NCURSES_SP_OUTC outc)
{
#ifdef USE_TERM_DRIVER
CallDriver_4(SP_PARM, docolor, old_pair, pair, reverse, outc);
#else
NCURSES_COLOR_T fg = COLOR_DEFAULT;
NCURSES_COLOR_T bg = COLOR_DEFAULT;
NCURSES_COLOR_T old_fg, old_bg;
@ -725,9 +805,9 @@ NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_DCLx
#if NCURSES_EXT_FUNCS
if (isDefaultColor(fg))
fg = default_fg();
fg = default_fg(NCURSES_SP_ARG);
if (isDefaultColor(bg))
bg = default_bg();
bg = default_bg(NCURSES_SP_ARG);
#endif
if (reverse) {
@ -745,6 +825,7 @@ NCURSES_SP_NAME(_nc_do_color) (NCURSES_SP_DCLx
if (!isDefaultColor(bg)) {
set_background_color(NCURSES_SP_ARGx bg, outc);
}
#endif
}
#if NCURSES_SP_FUNCS

View File

@ -35,7 +35,7 @@
/*
* $Id: curses.priv.h,v 1.430 2009/07/04 20:40:42 tom Exp $
* $Id: curses.priv.h,v 1.435 2009/08/22 22:33:25 tom Exp $
*
* curses.priv.h
*
@ -374,12 +374,14 @@ extern NCURSES_EXPORT(void) _nc_set_no_padding(SCREEN *);
#define GET_SCREEN_PAIR(s) GetPair(SCREEN_ATTRS(s))
#define SET_SCREEN_PAIR(s,p) SetPair(SCREEN_ATTRS(s), p)
#if USE_REENTRANT
#if USE_REENTRANT || NCURSES_SP_FUNCS
NCURSES_EXPORT(int *) _nc_ptr_Lines (SCREEN *);
NCURSES_EXPORT(int *) _nc_ptr_Cols (SCREEN *);
NCURSES_EXPORT(int *) _nc_ptr_Tabsize (SCREEN *);
NCURSES_EXPORT(int *) _nc_ptr_Escdelay (SCREEN *);
#endif
#if USE_REENTRANT
#define ptrLines(sp) (sp ? &(sp->_LINES) : &(_nc_prescreen._LINES))
#define ptrCols(sp) (sp ? &(sp->_COLS) : &(_nc_prescreen._COLS))
@ -1682,7 +1684,6 @@ extern NCURSES_EXPORT(char *) _nc_get_locale(void);
extern NCURSES_EXPORT(int) _nc_unicode_locale(void);
extern NCURSES_EXPORT(int) _nc_locale_breaks_acs(TERMINAL *);
extern NCURSES_EXPORT(int) _nc_setupterm(NCURSES_CONST char *, int, int *, bool);
extern NCURSES_EXPORT(void) _nc_get_screensize(SCREEN *, int *, int *);
/* lib_set_term.c */
extern NCURSES_EXPORT(int) _nc_ripoffline(int, int(*)(WINDOW*, int));
@ -1730,6 +1731,7 @@ extern NCURSES_EXPORT(int) _nc_remove_string (TRIES **, const char *);
/* elsewhere ... */
extern NCURSES_EXPORT(ENTRY *) _nc_delink_entry (ENTRY *, TERMTYPE *);
extern NCURSES_EXPORT(SCREEN *) _nc_screen_of (WINDOW *);
extern NCURSES_EXPORT(TERMINAL*) _nc_get_cur_term (void);
extern NCURSES_EXPORT(WINDOW *) _nc_makenew (int, int, int, int, int);
extern NCURSES_EXPORT(char *) _nc_trace_buf (int, size_t);
extern NCURSES_EXPORT(char *) _nc_trace_bufcat (int, const char *);
@ -1895,6 +1897,7 @@ extern NCURSES_EXPORT(int) _nc_get_tty_mode(TTY *);
}\
sp->jump = outc
#ifdef USE_TERM_DRIVER
struct DriverTCB; /* Terminal Control Block forward declaration */
typedef void* TERM_HANDLE;
@ -1956,7 +1959,6 @@ typedef struct term_driver {
bool (*kyExist)(struct DriverTCB*, int);
} TERM_DRIVER;
typedef struct DriverTCB
{
TERMINAL term; /* needs to be the first Element !!! */
@ -1985,18 +1987,56 @@ typedef struct DriverTCB
extern NCURSES_EXPORT_VAR(const color_t*) _nc_cga_palette;
extern NCURSES_EXPORT_VAR(const color_t*) _nc_hls_palette;
#ifdef USE_TERM_DRIVER
extern NCURSES_EXPORT(int) _nc_tinfo_has_key(SCREEN*, int);
extern NCURSES_EXPORT(int) _nc_tinfo_doupdate(SCREEN *sp);
extern NCURSES_EXPORT(int) _nc_tinfo_mvcur(SCREEN*,int,int,int,int);
extern NCURSES_EXPORT(int) _nc_get_driver(TERMINAL_CONTROL_BLOCK*, const char*, int*);
extern NCURSES_EXPORT(void) _nc_get_screensize_ex(SCREEN *, TERMINAL *, int *, int *);
#endif /* USE_TERM_DRIVER */
/*
* Entrypoints which are actually provided in the terminal driver, which would
* be an sp-name otherwise.
*/
#ifdef USE_TERM_DRIVER
#define TINFO_HAS_KEY _nc_tinfo_has_key
#define TINFO_DOUPDATE _nc_tinfo_doupdate
#define TINFO_MVCUR _nc_tinfo_mvcur
extern NCURSES_EXPORT(int) TINFO_HAS_KEY(SCREEN*, int);
extern NCURSES_EXPORT(int) TINFO_DOUPDATE(SCREEN *);
extern NCURSES_EXPORT(int) TINFO_MVCUR(SCREEN*, int, int, int, int);
#else
#define TINFO_HAS_KEY NCURSES_SP_NAME(has_key)
#define TINFO_DOUPDATE NCURSES_SP_NAME(doupdate)
#define TINFO_MVCUR NCURSES_SP_NAME(mvcur)
#endif
/*
* Entrypoints using an extra parameter with the terminal driver.
*/
#ifdef USE_TERM_DRIVER
extern NCURSES_EXPORT(void) _nc_get_screensize(SCREEN *, TERMINAL *, int *, int *);
extern NCURSES_EXPORT(int) _nc_setupterm_ex(TERMINAL **, NCURSES_CONST char *, int , int *, bool);
#define TINFO_GET_SIZE(sp, tp, lp, cp) \
_nc_get_screensize(sp, tp, lp, cp)
#define TINFO_SET_CURTERM(sp, tp) \
NCURSES_SP_NAME(set_curterm)(sp, tp)
#define TINFO_SETUP_TERM(tpp, name, fd, err, reuse) \
_nc_setupterm_ex(tpp, name, fd, err, reuse)
#else /* !USE_TERM_DRIVER */
extern NCURSES_EXPORT(void) _nc_get_screensize(SCREEN *, int *, int *);
#define TINFO_GET_SIZE(sp, tp, lp, cp) \
_nc_get_screensize(sp, lp, cp)
#define TINFO_SET_CURTERM(sp, tp) \
set_curterm(tp)
#define TINFO_SETUP_TERM(tpp, name, fd, err, reuse) \
_nc_setupterm(name, fd, err, reuse)
#endif /* !USE_TERM_DRIVER */
#ifdef USE_TERM_DRIVER
#ifdef __MINGW32__
#include <nc_mingw.h>
extern NCURSES_EXPORT_VAR(TERM_DRIVER) _nc_WIN_DRIVER;
#endif
extern NCURSES_EXPORT_VAR(TERM_DRIVER) _nc_TINFO_DRIVER;
#endif
#ifdef USE_TERM_DRIVER
#define IsTermInfo(sp) (TCBOf(sp) && ((TCBOf(sp)->drv->isTerminfo)))
@ -2030,7 +2070,7 @@ extern NCURSES_EXPORT(int) NCURSES_SP_NAME(_nc_set_tabsize)(SCREEN*, int);
* We put the safe versions of various calls here as they are not published
* part of the API up to now
*/
extern NCURSES_EXPORT(TERMINAL*) NCURSES_SP_NAME(cur_term)(SCREEN *sp);
extern NCURSES_EXPORT(TERMINAL*) NCURSES_SP_NAME(_nc_get_cur_term) (SCREEN *sp);
extern NCURSES_EXPORT(WINDOW *) NCURSES_SP_NAME(_nc_makenew) (SCREEN*, int, int, int, int, int);
extern NCURSES_EXPORT(bool) NCURSES_SP_NAME(_nc_reset_colors)(SCREEN*);
extern NCURSES_EXPORT(char *) NCURSES_SP_NAME(_nc_printf_string)(SCREEN*, const char *, va_list);

View File

@ -40,7 +40,7 @@
#include <term_entry.h> /* TTY, cur_term */
#include <termcap.h> /* ospeed */
MODULE_ID("$Id: lib_cur_term.c,v 1.22 2009/05/30 13:55:19 tom Exp $")
MODULE_ID("$Id: lib_cur_term.c,v 1.24 2009/08/22 22:37:13 tom Exp $")
#undef CUR
#define CUR termp->type.
@ -48,17 +48,33 @@ MODULE_ID("$Id: lib_cur_term.c,v 1.22 2009/05/30 13:55:19 tom Exp $")
#if BROKEN_LINKER && !USE_REENTRANT
NCURSES_EXPORT_VAR(TERMINAL *) cur_term = 0;
#elif BROKEN_LINKER || USE_REENTRANT
NCURSES_EXPORT(TERMINAL *)
NCURSES_SP_NAME(_nc_get_cur_term) (NCURSES_SP_DCL0)
{
return ((0 != TerminalOf(SP_PARM)) ? TerminalOf(SP_PARM) : CurTerm);
}
#if NCURSES_SP_FUNCS
NCURSES_EXPORT(TERMINAL *)
_nc_get_cur_term(void)
{
return NCURSES_SP_NAME(_nc_get_cur_term) (CURRENT_SCREEN);
}
#endif
NCURSES_EXPORT(TERMINAL *)
NCURSES_PUBLIC_VAR(cur_term) (void)
{
return (SP != 0 && SP->_term != 0) ? SP->_term : _nc_prescreen._cur_term;
return NCURSES_SP_NAME(_nc_get_cur_term) (NCURSES_SP_ARG);
}
#else
NCURSES_EXPORT_VAR(TERMINAL *) cur_term = 0;
#endif
NCURSES_EXPORT(TERMINAL *)
set_curterm(TERMINAL * termp)
NCURSES_SP_NAME(set_curterm) (NCURSES_SP_DCLx TERMINAL * termp)
{
TERMINAL *oldterm;
@ -66,20 +82,27 @@ set_curterm(TERMINAL * termp)
_nc_lock_global(curses);
oldterm = cur_term;
if (SP)
SP->_term = termp;
if (SP_PARM)
SP_PARM->_term = termp;
#if BROKEN_LINKER && !USE_REENTRANT
cur_term = termp;
#elif BROKEN_LINKER || USE_REENTRANT
_nc_prescreen._cur_term = termp;
#else
cur_term = termp;
CurTerm = termp;
#endif
if (termp != 0) {
#ifdef USE_TERM_DRIVER
TERMINAL_CONTROL_BLOCK *TCB = (TERMINAL_CONTROL_BLOCK *) termp;
ospeed = _nc_ospeed(termp->_baudrate);
if (TCB->drv->isTerminfo && termp->type.Strings) {
PC = (char) ((pad_char != NULL) ? pad_char[0] : 0);
}
TCB->csp = SP_PARM;
#else
ospeed = _nc_ospeed(termp->_baudrate);
if (termp->type.Strings) {
PC = (char) ((pad_char != NULL) ? pad_char[0] : 0);
}
#endif
}
_nc_unlock_global(curses);
@ -87,28 +110,52 @@ set_curterm(TERMINAL * termp)
return (oldterm);
}
#if NCURSES_SP_FUNCS
NCURSES_EXPORT(TERMINAL *)
set_curterm(TERMINAL * termp)
{
return NCURSES_SP_NAME(set_curterm) (CURRENT_SCREEN, termp);
}
#endif
NCURSES_EXPORT(int)
NCURSES_SP_NAME(del_curterm) (NCURSES_SP_DCLx TERMINAL * termp)
{
int rc = ERR;
T((T_CALLED("del_curterm(%p)"), termp));
T((T_CALLED("del_curterm(%p, %p)"), SP_PARM, termp));
_nc_lock_global(curses);
if (termp != 0) {
#ifdef USE_TERM_DRIVER
TERMINAL_CONTROL_BLOCK *TCB = (TERMINAL_CONTROL_BLOCK *) termp;
#endif
TERMINAL *cur = (
#if BROKEN_LINKER && !USE_REENTRANT
cur_term
#elif BROKEN_LINKER || USE_REENTRANT
NCURSES_SP_NAME(_nc_get_cur_term) (NCURSES_SP_ARG)
#else
cur_term
#endif
);
_nc_free_termtype(&(termp->type));
if (termp == cur)
NCURSES_SP_NAME(set_curterm) (NCURSES_SP_ARGx 0);
FreeIfNeeded(termp->_termname);
#if USE_HOME_TERMINFO
if (_nc_globals.home_terminfo != 0)
FreeAndNull(_nc_globals.home_terminfo);
#endif
#ifdef USE_TERM_DRIVER
if (TCB->drv)
TCB->drv->release(TCB);
#endif
free(termp);
if (termp == cur_term)
set_curterm(0);
rc = OK;
}
_nc_unlock_global(curses);
returnCode(rc);
}
@ -117,7 +164,11 @@ NCURSES_EXPORT(int)
del_curterm(TERMINAL * termp)
{
int rc = ERR;
_nc_lock_global(curses);
rc = NCURSES_SP_NAME(del_curterm) (CURRENT_SCREEN, termp);
_nc_unlock_global(curses);
return (rc);
}
#endif

View File

@ -46,7 +46,7 @@
#define CUR SP_TERMTYPE
#endif
MODULE_ID("$Id: lib_options.c,v 1.69 2009/07/25 16:05:16 tom Exp $")
MODULE_ID("$Id: lib_options.c,v 1.70 2009/08/16 14:16:38 tom Exp $")
NCURSES_EXPORT(int)
idlok(WINDOW *win, bool flag)
@ -274,7 +274,7 @@ has_key_internal(int keycode, TRIES * tp)
#ifdef USE_TERM_DRIVER
NCURSES_EXPORT(int)
_nc_tinfo_has_key(SCREEN *sp, int keycode)
TINFO_HAS_KEY(SCREEN *sp, int keycode)
{
return IsValidTIScreen(sp) ?
has_key_internal(keycode, sp->_keytry) : 0;

View File

@ -42,7 +42,7 @@
#endif
#endif
MODULE_ID("$Id: tinfo_driver.c,v 1.1 2009/05/23 22:40:30 juergen Exp $")
MODULE_ID("$Id: tinfo_driver.c,v 1.2 2009/08/16 14:17:08 tom Exp $")
/*
* SCO defines TIOCGSIZE and the corresponding struct. Other systems (SunOS,
@ -173,7 +173,7 @@ static int
drv_doupdate(TERMINAL_CONTROL_BLOCK * TCB)
{
AssertTCB();
return _nc_tinfo_doupdate(TCB->csp);
return TINFO_DOUPDATE(TCB->csp);
}
/*
@ -945,7 +945,7 @@ drv_mvcur(TERMINAL_CONTROL_BLOCK * TCB, int yold, int xold, int ynew, int xnew)
{
SCREEN *sp = TCB->csp;
AssertTCB();
return _nc_tinfo_mvcur(sp, yold, xold, ynew, xnew);
return TINFO_MVCUR(sp, yold, xold, ynew, xnew);
}
static void
@ -1383,7 +1383,7 @@ drv_kyExist(TERMINAL_CONTROL_BLOCK * TCB, int key)
AssertTCB();
if (TCB->csp)
res = _nc_tinfo_has_key(TCB->csp, key) == 0 ? FALSE : TRUE;
res = TINFO_HAS_KEY(TCB->csp, key) == 0 ? FALSE : TRUE;
return res;
}

View File

@ -43,7 +43,6 @@
*
*-----------------------------------------------------------------*/
#define NEED_NCURSES_CH_T 1
#include <curses.priv.h>
#ifndef CUR
@ -83,7 +82,7 @@
#include <ctype.h>
MODULE_ID("$Id: tty_update.c,v 1.258 2009/06/27 19:16:17 tom Exp $")
MODULE_ID("$Id: tty_update.c,v 1.258.1.2 2009/08/16 14:20:30 tom Exp tom $")
/*
* This define controls the line-breakout optimization. Every once in a
@ -198,8 +197,10 @@ GoTo(NCURSES_SP_DCLx int const row, int const col)
position_check(SP_PARM, SP_PARM->_cursrow, SP_PARM->_curscol, "GoTo");
NCURSES_SP_NAME(mvcur) (NCURSES_SP_ARGx SP_PARM->_cursrow,
SP_PARM->_curscol, row, col);
TINFO_MVCUR(NCURSES_SP_ARGx
SP_PARM->_cursrow,
SP_PARM->_curscol,
row, col);
position_check(SP_PARM, SP_PARM->_cursrow, SP_PARM->_curscol, "GoTo2");
}
@ -661,7 +662,7 @@ PutRange(NCURSES_SP_DCLx
if_USE_SCROLL_HINTS(win->_line[row].oldindex = row)
NCURSES_EXPORT(int)
NCURSES_SP_NAME(doupdate) (NCURSES_SP_DCL0)
TINFO_DOUPDATE(NCURSES_SP_DCL0)
{
int i;
int nonempty;
@ -1004,11 +1005,11 @@ NCURSES_SP_NAME(doupdate) (NCURSES_SP_DCL0)
returnCode(OK);
}
#if NCURSES_SP_FUNCS
#if NCURSES_SP_FUNCS && !defined(USE_TERM_DRIVER)
NCURSES_EXPORT(int)
doupdate(void)
{
return NCURSES_SP_NAME(doupdate) (CURRENT_SCREEN);
return TINFO_DOUPDATE(CURRENT_SCREEN);
}
#endif
@ -2162,11 +2163,11 @@ NCURSES_SP_NAME(_nc_screen_wrap) (NCURSES_SP_DCL0)
NCURSES_SP_NAME(_nc_outch));
SP_PARM->_default_color = FALSE;
NCURSES_SP_NAME(mvcur) (NCURSES_SP_ARGx
SP_PARM->_cursrow,
SP_PARM->_curscol,
screen_lines(SP_PARM) - 1,
0);
TINFO_MVCUR(NCURSES_SP_ARGx
SP_PARM->_cursrow,
SP_PARM->_curscol,
screen_lines(SP_PARM) - 1,
0);
ClrToEOL(NCURSES_SP_ARGx blank, TRUE);
}