##############################################################################
-# Copyright (c) 1998-2004,2005 Free Software Foundation, Inc. #
+# Copyright (c) 1998-2005,2008 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 "Software"), #
#
# Author: Juergen Pfeifer, 1996
#
-# $Id: Makefile.in,v 1.34 2006/12/17 16:45:02 tom Exp $
+# $Id: Makefile.in,v 1.35 2008/11/23 00:17:20 juergen Exp $
#
.SUFFIXES:
clean :: mostlyclean
rm -f *.o *.ali b_t*.* *.s $(PROGS) a.out core b_*_test.c *.xr[bs] \
- explain.msg trace screendump
+ explain.msg trace screendump b~*.ad[bs]
distclean :: clean
rm -f Makefile
------------------------------------------------------------------------------
-- Author: Juergen Pfeifer, 1996
-- Version Control:
--- $Revision: 1.22 $
--- $Date: 2008/07/26 18:51:11 $
+-- $Revision: 1.23 $
+-- $Date: 2008/11/16 00:19:59 $
-- Binding Version 01.00
------------------------------------------------------------------------------
with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
function Has_Mouse return Boolean
is
function Mouse_Avail return C_Int;
- pragma Import (C, Mouse_Avail, "_nc_has_mouse");
+ pragma Import (C, Mouse_Avail, "has_mouse");
begin
if Has_Key (Key_Mouse) or else Mouse_Avail /= 0 then
return True;
-- sale, use or other dealings in this Software without prior written --
-- authorization. --
-------------------------------------------------------------------------------
--- $Id: NEWS,v 1.1322 2008/11/16 00:35:35 tom Exp $
+-- $Id: NEWS,v 1.1325 2008/11/23 00:20:04 tom Exp $
-------------------------------------------------------------------------------
This is a log of changes that ncurses has gone through since Zeyd started
Changes through 1.9.9e did not credit all contributions;
it is not possible to add this information.
+20081122
+ + change _nc_has_mouse() to has_mouse(), reflect its use in C++ and
+ Ada95 (patch by Juergen Pfeifer).
+ + document in TO-DO an issue with Cygwin's package for GNAT (report
+ by Mike Dennison).
+ + improve error-checking of command-line options in "tabs" program.
+
20081115
+ change several terminfo entries to make consistent use of ANSI
clear-all-tabs -TD
-- sale, use or other dealings in this Software without prior written --
-- authorization. --
-------------------------------------------------------------------------------
--- $Id: TO-DO,v 1.51 2008/10/11 19:22:27 tom Exp $
+-- $Id: TO-DO,v 1.52 2008/11/22 22:58:59 tom Exp $
-------------------------------------------------------------------------------
SHORT-TERM TO-DO ITEMS:
+ the --with-pthread configuration builds for Cygwin, but does not work
properly (test/worm.c shows all of the worms in the same location).
++ the Ada95 tree requires a small fix to build on Cygwin, since the GNAT port
+ to that platform provides an incomplete Interrupts.Names package. For
+ instance (your gcc version may be different):
+ /usr/lib/gcc/i686-pc-cygwin/3.4.4/adainclude/a-intnam.ads
+
+ cut here...
+-------------------------------------------------------------------------------
+--- a-intnam.ads.orig 2003-10-21 13:41:51.000000000 +0000
++++ a-intnam.ads 2007-05-05 22:40:02.609375000 +0000
+@@ -44,5 +44,6 @@
+
+ DUMMY_INTERRUPT_1 : constant Interrupt_ID := 1;
+ DUMMY_INTERRUPT_2 : constant Interrupt_ID := 2;
++ SIGINT : constant Interrupt_ID := 1;
+
+ end Ada.Interrupts.Names;
+-------------------------------------------------------------------------------
+
+ the --enable-rpath configure option builds for the corresponding platforms;
however combining it with --with-ticlib and --with-termlib does not always
produce libraries that can be run without setting environment variables.
// * this is for making emacs happy: -*-Mode: C++;-*-
/****************************************************************************
- * Copyright (c) 2007 Free Software Foundation, Inc. *
+ * Copyright (c) 2007,2008 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 *
#include "internal.h"
#include "cursesw.h"
-MODULE_ID("$Id: cursesw.cc,v 1.49 2007/12/15 23:01:57 tom Exp $")
+MODULE_ID("$Id: cursesw.cc,v 1.50 2008/11/23 00:17:31 juergen Exp $")
#define COLORS_NEED_INITIALIZATION -1
#define COLORS_NOT_INITIALIZED 0
{
initialize();
w = win;
- assert((w->_maxx +1 ) == ncols);
}
int _nc_xx_ripoff_init(WINDOW *w, int ncols)
#if HAVE_HAS_KEY
bool NCursesWindow::has_mouse() const
{
- return ((::has_key(KEY_MOUSE) || ::_nc_has_mouse())
+ return ((::has_key(KEY_MOUSE) || ::has_mouse())
? TRUE : FALSE);
}
#endif
# use or other dealings in this Software without prior written #
# authorization. #
##############################################################################
-# $Id: dist.mk,v 1.672 2008/11/15 22:12:37 tom Exp $
+# $Id: dist.mk,v 1.673 2008/11/22 19:33:58 tom Exp $
# Makefile for creating ncurses distributions.
#
# This only needs to be used directly as a makefile by developers, but
# These define the major/minor/patch versions of ncurses.
NCURSES_MAJOR = 5
NCURSES_MINOR = 7
-NCURSES_PATCH = 20081115
+NCURSES_PATCH = 20081122
# We don't append the patch to the version, since this only applies to releases
VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR)
-/* $Id: curses.tail,v 1.16 2008/07/05 20:20:38 tom Exp $ */
+/* $Id: curses.tail,v 1.17 2008/11/23 00:12:12 tom Exp $ */
/*
* vile:cmode:
* This file is part of ncurses, designed to be appended after curses.h.in
}
MEVENT;
+extern NCURSES_EXPORT(bool) has_mouse (void);
extern NCURSES_EXPORT(int) getmouse (MEVENT *);
extern NCURSES_EXPORT(int) ungetmouse (MEVENT *);
extern NCURSES_EXPORT(mmask_t) mousemask (mmask_t, mmask_t *);
'\" t
.\"***************************************************************************
-.\" Copyright (c) 1998-2005,2006 Free Software Foundation, Inc. *
+.\" Copyright (c) 1998-2006,2008 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 *
.\" authorization. *
.\"***************************************************************************
.\"
-.\" $Id: curs_mouse.3x,v 1.30 2006/12/30 23:43:34 tom Exp $
+.\" $Id: curs_mouse.3x,v 1.31 2008/11/23 00:09:53 tom Exp $
.TH curs_mouse 3X ""
.na
.hy 0
.SH NAME
+\fBhas_mouse\fR,
\fBgetmouse\fR, \fBungetmouse\fR,
\fBmousemask\fR, \fBwenclose\fR,
\fBmouse_trafo\fR, \fBwmouse_trafo\fR,
MEVENT;\fR
.fi
.br
-\fBint getmouse(MEVENT *event);\fR
+\fBbool has_mouse(void);\fR
+.br
+-\fBint getmouse(MEVENT *event);\fR
.br
\fBint ungetmouse(MEVENT *event);\fR
.br
Use \fBmouseinterval(-1)\fR to obtain the interval without altering it.
The default is one sixth of a second.
.PP
+The \fBhas_mouse\fP function returns TRUE if the mouse driver has been
+successfully initialized.
+.PP
Note that mouse events will be ignored when input is in cooked mode, and will
cause an error beep when cooked mode is being simulated in a window by a
function such as \fBgetstr\fR that expects a linefeed for input-loop
#include <curses.priv.h>
-MODULE_ID("$Id: lib_mouse.c,v 1.102 2008/10/18 21:48:55 tom Exp $")
+MODULE_ID("$Id: lib_mouse.c,v 1.103 2008/11/23 00:11:46 tom Exp $")
#include <term.h>
#include <tic.h>
/* This may be used by other routines to ask for the existence of mouse
support */
-NCURSES_EXPORT(int)
-_nc_has_mouse(void)
+NCURSES_EXPORT(bool)
+_nc_has_mouse(SCREEN *sp)
+{
+ return ((sp->_mouse_type == M_NONE) ? FALSE : TRUE);
+}
+
+NCURSES_EXPORT(bool)
+has_mouse(void)
{
- return (SP->_mouse_type == M_NONE ? 0 : 1);
+ return _nc_has_mouse(SP);
}
NCURSES_EXPORT(bool)
/*
- * $Id: curses.priv.h,v 1.394 2008/10/04 21:37:45 tom Exp $
+ * $Id: curses.priv.h,v 1.395 2008/11/23 00:09:04 tom Exp $
*
* curses.priv.h
*
extern NCURSES_EXPORT(void) _nc_screen_wrap (void);
/* lib_mouse.c */
-extern NCURSES_EXPORT(int) _nc_has_mouse (void);
+extern NCURSES_EXPORT(bool) _nc_has_mouse (SCREEN *);
/* lib_mvcur.c */
#define INFINITY 1000000 /* cost: too high to use */
#define USE_LIBTINFO
#include <progs.priv.h>
-MODULE_ID("$Id: tabs.c,v 1.11 2008/11/16 00:58:24 tom Exp $")
+MODULE_ID("$Id: tabs.c,v 1.15 2008/11/23 00:47:51 tom Exp $")
static void usage(void) GCC_NORETURN;
int prior = 0;
int ch;
- while ((ch = *tab_list++) != '\0') {
- if (isdigit(UChar(ch))) {
- value *= 10;
- value += (ch - '0');
- } else if (ch == ',') {
- result[n] = value + prior;
- if (n > 0 && value <= result[n - 1]) {
- fprintf(stderr, "tab-stops are not in increasing order\n");
- ExitProgram(EXIT_FAILURE);
+ if (result != 0) {
+ while ((ch = *tab_list++) != '\0') {
+ if (isdigit(UChar(ch))) {
+ value *= 10;
+ value += (ch - '0');
+ } else if (ch == ',') {
+ result[n] = value + prior;
+ if (n > 0 && value <= result[n - 1]) {
+ fprintf(stderr,
+ "tab-stops are not in increasing order\n");
+ free(result);
+ result = 0;
+ break;
+ }
+ ++n;
+ value = 0;
+ prior = 0;
+ } else if (ch == '+') {
+ if (n)
+ prior = result[n - 1];
}
- ++n;
- value = 0;
- prior = 0;
- } else if (ch == '+') {
- if (n)
- prior = result[n - 1];
}
}
- /*
- * If there is only one value, then it is an option such as "-8".
- */
- if ((n == 0) && (value > 0)) {
- int step = value;
- while (n < max_cols - 1) {
- result[n++] = value;
- value += step;
+ if (result != 0) {
+ /*
+ * If there is only one value, then it is an option such as "-8".
+ */
+ if ((n == 0) && (value > 0)) {
+ int step = value;
+ while (n < max_cols - 1) {
+ result[n++] = value;
+ value += step;
+ }
}
- }
- /*
- * Add the last value, if any.
- */
- result[n++] = value;
- result[n] = 0;
+ /*
+ * Add the last value, if any.
+ */
+ result[n++] = value;
+ result[n] = 0;
+ }
return result;
}
putchar('\n');
}
+/*
+ * Trim leading/trailing blanks, as well as blanks after a comma.
+ * Convert embedded blanks to commas.
+ */
+static char *
+trimmed_tab_list(const char *source)
+{
+ char *result = strdup(source);
+ int ch, j, k, last;
+
+ if (result != 0) {
+ for (j = k = last = 0; result[j] != 0; ++j) {
+ ch = UChar(result[j]);
+ if (isspace(ch)) {
+ if (last == '\0') {
+ continue;
+ } else if (isdigit(last) || last == ',') {
+ ch = ',';
+ }
+ } else if (ch == ',') {
+ ;
+ } else {
+ if (last == ',')
+ result[k++] = last;
+ result[k++] = ch;
+ }
+ last = ch;
+ }
+ result[k] = '\0';
+ }
+ return result;
+}
+
+static bool
+comma_is_needed(const char *source)
+{
+ bool result = FALSE;
+
+ if (source != 0) {
+ unsigned len = strlen(source);
+ if (len != 0)
+ result = (source[len - 1] != ',');
+ } else {
+ result = FALSE;
+ }
+ return result;
+}
+
+/*
+ * Add a command-line parameter to the tab-list. It can be blank- or comma-
+ * separated (or a mixture). For simplicity, empty tabs are ignored, e.g.,
+ * tabs 1,,6,11
+ * tabs 1,6,11
+ * are treated the same.
+ */
+static const char *
+add_to_tab_list(char **append, const char *value)
+{
+ char *result = *append;
+ char *copied = trimmed_tab_list(value);
+
+ if (copied != 0 && *copied != '\0') {
+ const char *comma = ",";
+ unsigned need = 1 + strlen(copied);
+
+ if (*copied == ',')
+ comma = "";
+ else if (!comma_is_needed(*append))
+ comma = "";
+
+ need += strlen(comma);
+ if (*append != 0)
+ need += strlen(*append);
+
+ result = malloc(need);
+ if (result != 0) {
+ *result = '\0';
+ if (*append != 0) {
+ strcpy(result, *append);
+ free(*append);
+ }
+ strcat(result, comma);
+ strcat(result, copied);
+ }
+
+ *append = result;
+ }
+ return result;
+}
+
+/*
+ * Check for illegal characters in the tab-list.
+ */
+static bool
+legal_tab_list(const char *program, const char *tab_list)
+{
+ bool result = TRUE;
+
+ if (tab_list != 0 && *tab_list != '\0') {
+ if (comma_is_needed(tab_list)) {
+ int n, ch;
+ for (n = 0; tab_list[n] != '\0'; ++n) {
+ ch = UChar(tab_list[n]);
+ if (!(isdigit(ch) || ch == ',')) {
+ fprintf(stderr,
+ "%s: unexpected character found '%c'\n",
+ program, ch);
+ result = FALSE;
+ break;
+ }
+ }
+ } else {
+ fprintf(stderr, "%s: trailing comma found '%s'\n", program, tab_list);
+ result = FALSE;
+ }
+ } else {
+ fprintf(stderr, "%s: no tab-list given\n", program);
+ result = FALSE;
+ }
+ return result;
+}
+
static void
usage(void)
{
int
main(int argc, char *argv[])
{
- int rc = EXIT_SUCCESS;
+ int rc = EXIT_FAILURE;
bool debug = FALSE;
bool no_op = FALSE;
int n, ch;
}
break;
default:
- if (isdigit(*option)) {
- if (append != 0) {
- if (tab_list != (const char *) append) {
- /* one of the predefined options was used */
- append = strdup(option);
- tab_list = append;
- } else {
- append = malloc(strlen(tab_list) + strlen(option) + 2);
- sprintf(append, "%s,%s", tab_list, option);
- free((char *) tab_list);
- tab_list = append;
- }
- } else {
- append = strdup(option);
- tab_list = append;
+ if (append != 0) {
+ if (tab_list != (const char *) append) {
+ /* one of the predefined options was used */
+ free(append);
+ append = 0;
}
- } else {
- usage();
}
+ tab_list = add_to_tab_list(&append, option);
+ option += ((int) strlen(option)) - 1;
break;
}
}
fprintf(stderr,
"%s: terminal type '%s' cannot reset tabs\n",
argv[0], term_name);
- rc = EXIT_FAILURE;
} else if (!VALID_STRING(set_tab)) {
fprintf(stderr,
"%s: terminal type '%s' cannot set tabs\n",
argv[0], term_name);
- rc = EXIT_FAILURE;
- } else {
+ } else if (legal_tab_list(argv[0], tab_list)) {
int *list = decode_tabs(tab_list);
if (!no_op)
if (!no_op)
do_tabs(list);
if (debug) {
+ fflush(stderr);
+ printf("tabs %s\n", tab_list);
print_ruler(list);
write_tabs(list);
}
free(list);
+ } else if (debug) {
+ fflush(stderr);
+ printf("tabs %s\n", tab_list);
}
+ rc = EXIT_SUCCESS;
}
- if (append)
+ if (append != 0)
free(append);
ExitProgram(rc);
}