ncurses 6.0 - patch 20160312

+ modified test/filter.c to illustrate an alternative to getnstr, that
  polls for input while updating a clock on the right margin as well
  as responding to window size-changes.
This commit is contained in:
Thomas E. Dickey 2016-03-13 01:08:52 +00:00
parent 0d92180288
commit 79185cda09
11 changed files with 242 additions and 44 deletions

7
NEWS
View File

@ -25,7 +25,7 @@
-- sale, use or other dealings in this Software without prior written --
-- authorization. --
-------------------------------------------------------------------------------
-- $Id: NEWS,v 1.2578 2016/03/05 23:25:40 tom Exp $
-- $Id: NEWS,v 1.2580 2016/03/12 18:59:41 tom Exp $
-------------------------------------------------------------------------------
This is a log of changes that ncurses has gone through since Zeyd started
@ -45,6 +45,11 @@ 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.
20160312
+ modified test/filter.c to illustrate an alternative to getnstr, that
polls for input while updating a clock on the right margin as well
as responding to window size-changes.
20160305
+ omit a redefinition of "inline" when traces are enabled, since this
does not work with gcc 5.3.x MinGW cross-compiling (cf: 20150912).

View File

@ -1 +1 @@
5:0:9 6.0 20160305
5:0:9 6.0 20160312

View File

@ -25,7 +25,7 @@
# use or other dealings in this Software without prior written #
# authorization. #
##############################################################################
# $Id: dist.mk,v 1.1096 2016/03/05 21:46:00 tom Exp $
# $Id: dist.mk,v 1.1097 2016/03/12 14:38:16 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 = 6
NCURSES_MINOR = 0
NCURSES_PATCH = 20160305
NCURSES_PATCH = 20160312
# We don't append the patch to the version, since this only applies to releases
VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR)

View File

@ -39,7 +39,7 @@
#include <curses.priv.h>
MODULE_ID("$Id: lib_ins_wch.c,v 1.18 2016/02/20 22:01:09 tom Exp $")
MODULE_ID("$Id: lib_ins_wch.c,v 1.20 2016/03/13 00:42:34 tom Exp $")
/*
* Insert the given character, updating the current location to simplify
@ -73,7 +73,7 @@ _nc_insert_wch(WINDOW *win, const cchar_t *wch)
SetWidecExt(temp1[cell], cell);
}
win->_curx += cells;
win->_curx = (NCURSES_SIZE_T) (win->_curx + cells);
}
}
return code;

View File

@ -1,8 +1,8 @@
ncurses6 (6.0+20160305) unstable; urgency=low
ncurses6 (6.0+20160312) unstable; urgency=low
* latest weekly patch
-- Thomas E. Dickey <dickey@invisible-island.net> Sat, 05 Mar 2016 16:46:00 -0500
-- Thomas E. Dickey <dickey@invisible-island.net> Sat, 12 Mar 2016 09:38:16 -0500
ncurses6 (5.9-20131005) unstable; urgency=low

View File

@ -1,8 +1,8 @@
ncurses6 (6.0+20160305) unstable; urgency=low
ncurses6 (6.0+20160312) unstable; urgency=low
* latest weekly patch
-- Thomas E. Dickey <dickey@invisible-island.net> Sat, 05 Mar 2016 16:46:00 -0500
-- Thomas E. Dickey <dickey@invisible-island.net> Sat, 12 Mar 2016 09:38:16 -0500
ncurses6 (5.9-20131005) unstable; urgency=low

View File

@ -1,8 +1,8 @@
ncurses6 (6.0+20160305) unstable; urgency=low
ncurses6 (6.0+20160312) unstable; urgency=low
* latest weekly patch
-- Thomas E. Dickey <dickey@invisible-island.net> Sat, 05 Mar 2016 16:46:00 -0500
-- Thomas E. Dickey <dickey@invisible-island.net> Sat, 12 Mar 2016 09:38:16 -0500
ncurses6 (5.9-20120608) unstable; urgency=low

View File

@ -1,4 +1,4 @@
; $Id: mingw-ncurses.nsi,v 1.148 2016/03/05 21:46:00 tom Exp $
; $Id: mingw-ncurses.nsi,v 1.149 2016/03/12 14:38:16 tom Exp $
; TODO add examples
; TODO bump ABI to 6
@ -10,7 +10,7 @@
!define VERSION_MAJOR "6"
!define VERSION_MINOR "0"
!define VERSION_YYYY "2016"
!define VERSION_MMDD "0305"
!define VERSION_MMDD "0312"
!define VERSION_PATCH ${VERSION_YYYY}${VERSION_MMDD}
!define MY_ABI "5"

View File

@ -3,7 +3,7 @@
Summary: shared libraries for terminal handling
Name: mingw32-ncurses6
Version: 6.0
Release: 20160305
Release: 20160312
License: X11
Group: Development/Libraries
Source: ncurses-%{version}-%{release}.tgz

View File

@ -1,7 +1,7 @@
Summary: shared libraries for terminal handling
Name: ncurses6
Version: 6.0
Release: 20160305
Release: 20160312
License: X11
Group: Development/Libraries
Source: ncurses-%{version}-%{release}.tgz

View File

@ -1,5 +1,5 @@
/****************************************************************************
* Copyright (c) 1998-2012,2014 Free Software Foundation, Inc. *
* Copyright (c) 1998-2014,2016 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 *
@ -27,15 +27,10 @@
****************************************************************************/
/*
* Author: Thomas E. Dickey <dickey@clark.net> 1998
* Author: Thomas E. Dickey 1998
*
* $Id: filter.c,v 1.22 2016/03/13 00:41:43 tom Exp $
*
* $Id: filter.c,v 1.16 2014/08/09 22:35:51 tom Exp $
*/
#include <test.priv.h>
#if HAVE_FILTER
/*
* An example of the 'filter()' function in ncurses, this program prompts
* for commands and executes them (like a command shell). It illustrates
* how ncurses can be used to implement programs that are not full-screen.
@ -46,31 +41,216 @@
* reset_shell_mode() and reset_prog_mode() functions, we could invoke endwin()
* and refresh(), but that does not work any better.
*/
#include <test.priv.h>
#if HAVE_FILTER
#include <time.h>
static int
new_command(char *buffer, int length, int underline)
show_prompt(int underline, bool clocked)
{
int code;
int limit = COLS;
attron(A_BOLD);
printw("Command: ");
move(0, 0);
attrset(A_NORMAL);
clrtoeol();
attrset(A_BOLD);
addstr("Command: ");
limit -= getcurx(stdscr);
if (clocked) {
if (limit >= 3) {
time_t now = time((time_t *) 0);
struct tm *my = localtime(&now);
char buffer[80];
int skip, y, x;
int margin;
sprintf(buffer, "%02d:%02d:%02d",
my->tm_hour,
my->tm_min,
my->tm_sec);
if (limit > 9) {
skip = 0;
} else if (limit > 6) {
skip = 3;
} else {
skip = 6;
}
/*
* Write the clock message on the right-margin so we can show the
* results of resizing the screen.
*/
getyx(stdscr, y, x);
margin = (int) strlen(buffer) - skip;
limit -= margin;
move(0, COLS - margin);
addstr(buffer);
move(y, x);
}
}
attron(underline);
code = getnstr(buffer, length);
/*
* If this returns anything except ERR/OK, it would be one of ncurses's
* extensions. Fill the buffer with something harmless that the shell
* will execute as a comment.
*/
return limit;
}
static int
new_command(char *buffer, int length, int underline, bool clocked, bool polled)
{
int code = OK;
int limit;
if (polled) {
bool done = FALSE;
bool first = TRUE;
int y, x;
int n;
int mark = 0;
int used = 0;
const int gap = 2;
timeout(20); /* no one types 50CPS... */
while (!done) {
int ch = getch();
buffer[used] = '\0';
limit = show_prompt(underline, clocked);
if (first) {
getyx(stdscr, y, x);
first = FALSE;
} else {
int left = 0;
/*
* if the screen is too narrow to show the whole buffer,
* shift the editing point left/right as needed.
*/
move(y, x);
if ((used + gap) > limit) {
while ((mark - left + gap) > limit) {
left += limit / 2;
}
}
printw("%.*s", limit, buffer + left);
move(y, x + mark - left);
}
switch (ch) {
case ERR:
continue;
case '\004':
code = ERR;
done = TRUE;
break;
case KEY_ENTER:
case '\n':
done = TRUE;
break;
case KEY_BACKSPACE:
case '\b':
if (used) {
if (mark < used) {
/* getnstr does not do this */
if (mark > 0) {
--mark;
for (n = mark; n < used; ++n) {
buffer[n] = buffer[n + 1];
}
} else {
flash();
}
} else {
/* getnstr does this */
mark = --used;
buffer[used] = '\0';
}
} else {
flash();
}
break;
/*
* Unlike getnstr, this function can move the cursor into the
* middle of the buffer and insert/delete at that point.
*/
case KEY_HOME:
mark = 0;
break;
case KEY_END:
mark = used;
break;
case KEY_LEFT:
if (mark > 0) {
mark--;
} else {
flash();
}
break;
case KEY_RIGHT:
if (mark < used) {
mark++;
} else {
flash();
}
break;
#ifdef KEY_EVENT
if (code == KEY_EVENT)
strcpy(buffer, "# event!");
case KEY_EVENT:
continue;
#endif
#ifdef KEY_RESIZE
if (code == KEY_RESIZE) {
strcpy(buffer, "# resize!");
getch();
}
case KEY_RESIZE:
/*
* Unlike getnstr, this function "knows" what the whole screen
* is supposed to look like, and can handle resize events.
*/
continue;
#endif
case '\t':
ch = ' ';
/* FALLTHRU */
default:
if (ch >= KEY_MIN) {
flash();
continue;
}
if (mark < used) {
/* getnstr does not do this... */
for (n = used + 1; n > mark; --n) {
buffer[n] = buffer[n - 1];
}
buffer[mark] = (char) ch;
used++;
mark++;
} else {
/* getnstr does this part */
buffer[used] = (char) ch;
mark = ++used;
}
break;
}
}
} else {
show_prompt(underline, clocked);
code = getnstr(buffer, length);
/*
* If this returns anything except ERR/OK, it would be one of ncurses's
* extensions. Fill the buffer with something harmless that the shell
* will execute as a comment.
*/
#ifdef KEY_EVENT
if (code == KEY_EVENT)
strcpy(buffer, "# event!");
#endif
#ifdef KEY_RESIZE
if (code == KEY_RESIZE) {
strcpy(buffer, "# resize!");
getch();
}
#endif
}
attroff(underline);
attroff(A_BOLD);
printw("\n");
@ -86,7 +266,9 @@ usage(void)
"Usage: filter [options]"
,""
,"Options:"
," -c show current time on prompt line with \"Command\""
," -i use initscr() rather than newterm()"
," -p poll for individual characters rather than using getnstr"
};
unsigned n;
for (n = 0; n < SIZEOF(msg); n++)
@ -100,15 +282,23 @@ main(int argc, char *argv[])
int ch;
char buffer[80];
int underline;
bool c_option = FALSE;
bool i_option = FALSE;
bool p_option = FALSE;
setlocale(LC_ALL, "");
while ((ch = getopt(argc, argv, "i")) != -1) {
while ((ch = getopt(argc, argv, "cip")) != -1) {
switch (ch) {
case 'c':
c_option = TRUE;
break;
case 'i':
i_option = TRUE;
break;
case 'p':
p_option = TRUE;
break;
default:
usage();
}
@ -138,8 +328,11 @@ main(int argc, char *argv[])
underline = A_UNDERLINE;
}
while (new_command(buffer, sizeof(buffer) - 1, underline) != ERR
&& strlen(buffer) != 0) {
for (;;) {
int code = new_command(buffer, sizeof(buffer) - 1,
underline, c_option, p_option);
if (code == ERR || *buffer == '\0')
break;
reset_shell_mode();
printf("\n");
fflush(stdout);