/****************************************************************************
- * Copyright 2018-2022,2023 Thomas E. Dickey *
+ * Copyright 2018-2023,2024 Thomas E. Dickey *
* Copyright 1998-2017,2018 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
****************************************************************************/
/*
- * $Id: curses.priv.h,v 1.670 2023/06/24 13:00:26 tom Exp $
+ * $Id: curses.priv.h,v 1.688 2024/05/04 18:30:25 tom Exp $
*
* curses.priv.h
*
#include <unistd.h>
#endif
-#if HAVE_LIMITS_H
-# include <limits.h>
-#elif HAVE_SYS_PARAM_H
-# include <sys/param.h>
-#endif
-
#include <assert.h>
#include <stdio.h>
# endif
#endif
-#ifndef PATH_MAX
-# if defined(_POSIX_PATH_MAX)
-# define PATH_MAX _POSIX_PATH_MAX
-# elif defined(MAXPATHLEN)
-# define PATH_MAX MAXPATHLEN
-# else
-# define PATH_MAX 255 /* the Posix minimum path-size */
-# endif
-#endif
-
#if DECL_ERRNO
extern int errno;
#endif
#if (defined(__USE_MINGW_ANSI_STDIO) && __USE_MINGW_ANSI_STDIO != 0) && (defined(__GNUC__) && (__GNUC__ < 12))
# undef PRIxPTR /* gcc bug fixed in 12.x */
# define PRIxPTR "lX"
-# define CASTxPTR(n) (unsigned long)(intptr_t)(n)
+# define CASTxPTR(n) (unsigned long)(intptr_t)(void*)(n)
#else
# define CASTxPTR(n) (intptr_t)(n)
#endif
#ifndef PRIxPTR
# define PRIxPTR "lx"
-# define CASTxPTR(n) (long)(n)
+# undef CASTxPTR
+# define CASTxPTR(n) (long)(void*)(n)
#endif
/* include signal.h before curses.h to work-around defect in glibc 2.1.3 */
#define NO_TERMINAL "unknown"
#define USE_SP_RIPOFF 1
#define USE_SP_TERMTYPE 1
-#define USE_SP_WINDOWLIST 1
#else
#define NO_TERMINAL 0
#endif
: no_terminal), \
NonEmpty(term_env))
+/*
+ * Originally a terminal-driver option, the window-list is per-screen to allow
+ * freeing memory used for windows when a screen is deleted.
+ */
+#define USE_SP_WINDOWLIST 1
+
/*
* Note: ht/cbt expansion flakes out randomly under Linux 1.1.47, but only
* when we're throwing control codes at the screen at high volume. To see
*/
#define StringOf(ch) {ch, 0}
+#define CSI_CHR 0x9b
+#define ESC_CHR 0x1b
+
+#define L_BLOCK '['
+#define R_BLOCK ']'
#define L_BRACE '{'
#define R_BRACE '}'
#define S_QUOTE '\''
#endif /* HAVE_LIBDL */
#endif /* USE_GPM_SUPPORT */
+/*
+ * Limit delay-times to 30 seconds, which is consistent with signed 16-bit
+ * numbers in legacy terminfo.
+ */
+#define MAX_DELAY_MSECS 30000
+
/*
* When converting from terminfo to termcap, check for cases where we can trim
* octal escapes down to 2-character form. It is useful for terminfo format
* string is less than 80 columns, but this buffer size is an absolute
* limit.
*/
+#define TRACECHR_BUF 40
#define TRACEMSE_MAX (80 + (5 * 10) + (32 * 15))
#define TRACEMSE_FMT "id %2d at (%2d, %2d, %2d) state %4lx = {" /* } */
extern NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen;
typedef enum {
- ewInitial = 0,
+ ewUnknown = 0,
+ ewInitial,
ewRunning,
ewSuspend
} ENDWIN;
#endif
#ifdef TRACE
- char tracechr_buf[40];
+ char tracechr_buf[TRACECHR_BUF];
char tracemse_buf[TRACEMSE_MAX];
#if USE_REENTRANT
long _outchars;
/* Checks for isprint() should be done on 8-bit characters (non-wide) */
#define is8bits(c) ((unsigned)(c) <= UCHAR_MAX)
-#ifndef min
-#define min(a,b) ((a) > (b) ? (b) : (a))
+#ifndef Min
+#define Min(a,b) ((a) > (b) ? (b) : (a))
#endif
-#ifndef max
-#define max(a,b) ((a) < (b) ? (b) : (a))
+#ifndef Max
+#define Max(a,b) ((a) < (b) ? (b) : (a))
#endif
/* usually in <unistd.h> */
#define TR_PUTC(c) TR(TRACE_CHARPUT, ("PUTC %#x", UChar(c)))
-#ifndef MB_LEN_MAX
-#define MB_LEN_MAX 16 /* should be >= MB_CUR_MAX, but that may be a function */
-#endif
-
#if USE_WIDEC_SUPPORT /* { */
/* true if the status/errno indicate an illegal multibyte sequence */
#define isEILSEQ(status) (((size_t)status == (size_t)-1) && (errno == EILSEQ))
#define NulColor /* nothing */
#endif
-#define NulChar 0,0,0,0 /* FIXME: see CCHARW_MAX */
+#if CCHARW_MAX > 6
+#define NulChar 0,0,0,0,0
+#elif CCHARW_MAX > 5
+#define NulChar 0,0,0,0 /* ncurses7 */
+#elif CCHARW_MAX > 4
+#define NulChar 0,0,0 /* ncurses6 */
+#elif CCHARW_MAX > 3
+#define NulChar 0,0
+#elif CCHARW_MAX > 2
+#define NulChar 0
+#else
+#define NulChar /* nothing */
+#endif
+
#define CharOf(c) ((c).chars[0])
#define AttrOf(c) ((c).attr)
#define NewChar2(c,a) { a, { c, NulChar } NulColor }
#define NewChar(ch) NewChar2(ChCharOf(ch), ChAttrOf(ch))
-#if CCHARW_MAX == 5
+#if CCHARW_MAX > 1
#define CharEq(a,b) (((a).attr == (b).attr) \
- && (a).chars[0] == (b).chars[0] \
- && (a).chars[1] == (b).chars[1] \
- && (a).chars[2] == (b).chars[2] \
- && (a).chars[3] == (b).chars[3] \
- && (a).chars[4] == (b).chars[4] \
+ && !memcmp((a).chars, \
+ (b).chars, \
+ CCHARW_MAX * sizeof((b).chars[0])) \
if_EXT_COLORS(&& (a).ext_color == (b).ext_color))
-#elif CCHARW_MAX > 0
-#error Inconsistent values for CCHARW_MAX
#else
#define CharEq(a,b) (!memcmp(&(a), &(b), sizeof(a)))
#endif
#if defined(_NC_WINDOWS) || defined(_NC_MINGW)
/* see wcwidth.c */
-extern NCURSES_EXPORT(int) mk_wcwidth(wchar_t);
+extern NCURSES_EXPORT(int) mk_wcwidth(uint32_t);
#define wcwidth(ucs) _nc_wcwidth(ucs)
#endif
#define NC_ISATTY(fd) isatty(fd)
#endif
+/*
+ * Perhaps not "real" but possibly not "fake".
+ */
+#define IsRealTty(fd,value) \
+ (NC_ISATTY(fd) \
+ && (value = ttyname(fd)) != NULL \
+ && strncmp(value, "/dev/pts/", 9))
+
#ifdef USE_TERM_DRIVER
# define IsTermInfo(sp) ((TCBOf(sp) != 0) && ((TCBOf(sp)->drv->isTerminfo)))
# define HasTInfoTerminal(sp) ((0 != TerminalOf(sp)) && IsTermInfo(sp))