ncurses 5.6 - patch 20080531

+ modify wgetch() to use the screen which corresponds to its window
  parameter rather than relying on SP; some dependent functions still
  use SP internally.
+ factor out most use of SP in lib_mouse.c, using parameter.
+ add internal _nc_keyname(), replacing keyname() to associate with a
  particular SCREEN rather than the global SP.
+ add internal _nc_unctrl(), replacing unctrl() to associate with a
  particular SCREEN rather than the global SP.
+ add internal _nc_tracemouse(), replacing _tracemouse() to eliminate
  its associated global buffer _nc_globals.tracemse_buf now in SCREEN.
+ add internal _nc_tracechar(), replacing _tracechar() to use SCREEN in
  preference to the global _nc_globals.tracechr_buf buffer.
This commit is contained in:
Thomas E. Dickey 2008-05-31 23:49:39 +00:00
parent 9edffa2f21
commit bd7ef7c230
18 changed files with 370 additions and 283 deletions

16
NEWS
View File

@ -25,7 +25,7 @@
-- sale, use or other dealings in this Software without prior written --
-- authorization. --
-------------------------------------------------------------------------------
-- $Id: NEWS,v 1.1237 2008/05/24 22:23:07 tom Exp $
-- $Id: NEWS,v 1.1241 2008/05/31 21:52:48 tom Exp $
-------------------------------------------------------------------------------
This is a log of changes that ncurses has gone through since Zeyd started
@ -45,6 +45,20 @@ 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.
20080531
+ modify wgetch() to use the screen which corresponds to its window
parameter rather than relying on SP; some dependent functions still
use SP internally.
+ factor out most use of SP in lib_mouse.c, using parameter.
+ add internal _nc_keyname(), replacing keyname() to associate with a
particular SCREEN rather than the global SP.
+ add internal _nc_unctrl(), replacing unctrl() to associate with a
particular SCREEN rather than the global SP.
+ add internal _nc_tracemouse(), replacing _tracemouse() to eliminate
its associated global buffer _nc_globals.tracemse_buf now in SCREEN.
+ add internal _nc_tracechar(), replacing _tracechar() to use SCREEN in
preference to the global _nc_globals.tracechr_buf buffer.
20080524
+ modify _nc_keypad() to make it switch temporarily as needed to the
screen which must be updated.

View File

@ -25,7 +25,7 @@
# use or other dealings in this Software without prior written #
# authorization. #
##############################################################################
# $Id: dist.mk,v 1.643 2008/05/24 12:05:32 tom Exp $
# $Id: dist.mk,v 1.644 2008/05/31 14:47:34 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 = 6
NCURSES_PATCH = 20080524
NCURSES_PATCH = 20080531
# We don't append the patch to the version, since this only applies to releases
VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR)

View File

@ -1,6 +1,6 @@
# $Id: MKkeyname.awk,v 1.38 2007/08/18 18:41:18 tom Exp $
# $Id: MKkeyname.awk,v 1.39 2008/05/31 19:54:58 tom Exp $
##############################################################################
# Copyright (c) 1999-2006,2007 Free Software Foundation, Inc. #
# Copyright (c) 1999-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 "Software"), #
@ -67,7 +67,7 @@ END {
print "#define SIZEOF_TABLE 256"
print "#define MyTable _nc_globals.keyname_table"
print ""
print "NCURSES_EXPORT(NCURSES_CONST char *) keyname (int c)"
print "NCURSES_EXPORT(NCURSES_CONST char *) _nc_keyname (SCREEN *sp, int c)"
print "{"
print " int i;"
print " char name[20];"
@ -100,7 +100,7 @@ END {
print " if (MyTable[c] == 0) {"
print " int cc = c;"
print " p = name;"
print " if (cc >= 128 && (SP == 0 || SP->_use_meta)) {"
print " if (cc >= 128 && (sp == 0 || sp->_use_meta)) {"
print " strcpy(p, \"M-\");"
print " p += 2;"
print " cc -= 128;"
@ -141,6 +141,11 @@ END {
print " return result;"
print "}"
print ""
print "NCURSES_EXPORT(NCURSES_CONST char *) keyname (int c)"
print "{"
print "\treturn _nc_keyname(SP, c);"
print "}"
print ""
print "#if NO_LEAKS"
print "void _nc_keyname_leaks(void)"
print "{"

View File

@ -1,4 +1,4 @@
# $Id: MKunctrl.awk,v 1.21 2008/02/03 20:24:30 tom Exp $
# $Id: MKunctrl.awk,v 1.22 2008/05/31 19:36:11 tom Exp $
##############################################################################
# Copyright (c) 1998-2007,2008 Free Software Foundation, Inc. #
# #
@ -46,7 +46,7 @@ BEGIN {
print ""
}
END {
print "NCURSES_EXPORT(NCURSES_CONST char *) unctrl (register chtype ch)"
print "NCURSES_EXPORT(NCURSES_CONST char *) _nc_unctrl (SCREEN *sp, chtype ch)"
print "{"
blob=""
@ -150,8 +150,8 @@ END {
print ""
print "\tif (check >= 0 && check < (int)SIZEOF(unctrl_table)) {"
print "#if NCURSES_EXT_FUNCS"
print "\t\tif ((SP != 0)"
print "\t\t && (SP->_legacy_coding > 1)"
print "\t\tif ((sp != 0)"
print "\t\t && (sp->_legacy_coding > 1)"
print "\t\t && (check >= 128)"
print "\t\t && (check < 160))"
printf "\t\t\tresult = %s_c1[check - 128];\n", stringname;
@ -159,18 +159,18 @@ END {
print "#if USE_WIDEC_SUPPORT"
print "\t\tif ((check >= 160)"
print "\t\t && (check < 256)"
print "\t\t && ((SP != 0)"
print "\t\t && ((SP->_legacy_coding > 0)"
print "\t\t || (SP->_legacy_coding == 0"
print "\t\t && ((sp != 0)"
print "\t\t && ((sp->_legacy_coding > 0)"
print "\t\t || (sp->_legacy_coding == 0"
print "\t\t && (isprint(check) || iswprint(check))))))"
printf "\t\t\tresult = %s_c1[check - 128];\n", stringname;
print "\t\telse"
print "#else"
print "\t\tif ((check >= 160)"
print "\t\t && (check < 256)"
print "\t\t && ((SP != 0)"
print "\t\t && ((SP->_legacy_coding > 0)"
print "\t\t || (SP->_legacy_coding == 0"
print "\t\t && ((sp != 0)"
print "\t\t && ((sp->_legacy_coding > 0)"
print "\t\t || (sp->_legacy_coding == 0"
print "\t\t && isprint(check)))))"
printf "\t\t\tresult = %s_c1[check - 128];\n", stringname;
print "\t\telse"
@ -182,4 +182,9 @@ END {
print "\t}"
print "\treturn (NCURSES_CONST char *)result;"
print "}"
print ""
print "NCURSES_EXPORT(NCURSES_CONST char *) unctrl (chtype ch)"
print "{"
print "\treturn _nc_unctrl(SP, ch);"
print "}"
}

View File

@ -41,7 +41,7 @@
#include <curses.priv.h>
MODULE_ID("$Id: lib_getch.c,v 1.87 2008/05/03 22:42:10 tom Exp $")
MODULE_ID("$Id: lib_getch.c,v 1.91 2008/05/31 21:47:48 tom Exp $")
#include <fifo_defs.h>
@ -123,7 +123,7 @@ fifo_pull(SCREEN *sp)
{
int ch;
ch = sp->_fifo[head];
TR(TRACE_IEVENT, ("pulling %s from %d", _tracechar(ch), head));
TR(TRACE_IEVENT, ("pulling %s from %d", _nc_tracechar(sp, ch), head));
if (peek == head) {
h_inc();
@ -228,7 +228,7 @@ fifo_push(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl))
if (head == -1)
head = peek = tail;
t_inc();
TR(TRACE_IEVENT, ("pushed %s at %d", _tracechar(ch), tail));
TR(TRACE_IEVENT, ("pushed %s at %d", _nc_tracechar(sp, ch), tail));
#ifdef TRACE
if (USE_TRACEF(TRACE_IEVENT)) {
_nc_fifo_dump(sp);
@ -248,9 +248,14 @@ fifo_clear(SCREEN *sp)
static int kgetch(SCREEN *EVENTLIST_2nd(_nc_eventlist * evl));
#define wgetch_should_refresh(win) (\
(is_wintouched(win) || (win->_flags & _HASMOVED)) \
&& !(win->_flags & _ISPAD))
static void
refresh_if_needed(WINDOW *win)
{
if ((is_wintouched(win) || (win->_flags & _HASMOVED))
&& !(win->_flags & _ISPAD)) {
wrefresh(win);
}
}
NCURSES_EXPORT(int)
_nc_wgetch(WINDOW *win,
@ -258,7 +263,7 @@ _nc_wgetch(WINDOW *win,
int use_meta
EVENTLIST_2nd(_nc_eventlist * evl))
{
SCREEN *sp = SP;
SCREEN *sp = _nc_screen_of(win);
int ch;
#ifdef NCURSES_WGETCH_EVENTS
long event_delay = -1;
@ -272,9 +277,7 @@ _nc_wgetch(WINDOW *win,
}
if (cooked_key_in_fifo()) {
if (wgetch_should_refresh(win))
wrefresh(win);
refresh_if_needed(win);
*result = fifo_pull(sp);
returnCode(*result >= KEY_MIN ? KEY_CODE_YES : OK);
}
@ -324,8 +327,7 @@ _nc_wgetch(WINDOW *win,
if (win->_use_keypad != sp->_keypad_on)
_nc_keypad(sp, win->_use_keypad);
if (wgetch_should_refresh(win))
wrefresh(win);
refresh_if_needed(win);
if (!win->_notimeout && (win->_delay >= 0 || sp->_cbreak > 1)) {
if (head == -1) { /* fifo is empty */
@ -388,7 +390,7 @@ _nc_wgetch(WINDOW *win,
&& (((rc = check_mouse_activity(sp, sp->_maxclick
EVENTLIST_2nd(evl))) != 0
&& !(rc & 4))
|| !sp->_mouse_parse(runcount)));
|| !sp->_mouse_parse(sp, runcount)));
#ifdef NCURSES_WGETCH_EVENTS
if ((rc & 4) && !ch == KEY_EVENT) {
_nc_ungetch(sp, ch);
@ -467,7 +469,7 @@ _nc_wgetch(WINDOW *win,
if ((ch < KEY_MIN) && (ch & 0x80))
ch &= 0x7f;
T(("wgetch returning : %s", _tracechar(ch)));
T(("wgetch returning : %s", _nc_tracechar(sp, ch)));
*result = ch;
returnCode(ch >= KEY_MIN ? KEY_CODE_YES : OK);
@ -477,7 +479,7 @@ _nc_wgetch(WINDOW *win,
NCURSES_EXPORT(int)
wgetch_events(WINDOW *win, _nc_eventlist * evl)
{
SCREEN *sp = SP;
SCREEN *sp = _nc_screen_of(win);
int code;
unsigned long value;
@ -495,7 +497,7 @@ wgetch_events(WINDOW *win, _nc_eventlist * evl)
NCURSES_EXPORT(int)
wgetch(WINDOW *win)
{
SCREEN *sp = SP;
SCREEN *sp = _nc_screen_of(win);
int code;
unsigned long value;
@ -564,7 +566,7 @@ kgetch(SCREEN *sp EVENTLIST_2nd(_nc_eventlist * evl))
return ch;
}
TR(TRACE_IEVENT, ("ch: %s", _tracechar((unsigned char) ch)));
TR(TRACE_IEVENT, ("ch: %s", _nc_tracechar(sp, (unsigned char) ch)));
while ((ptr != NULL) && (ptr->ch != (unsigned char) ch))
ptr = ptr->sibling;

View File

@ -1,5 +1,5 @@
/****************************************************************************
* Copyright (c) 1998-2002,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 *
@ -41,7 +41,7 @@
#include <curses.priv.h>
#include <term.h>
MODULE_ID("$Id: lib_getstr.c,v 1.25 2006/01/12 00:33:52 tom Exp $")
MODULE_ID("$Id: lib_getstr.c,v 1.26 2008/05/31 22:05:15 tom Exp $")
/*
* This wipes out the last character, no matter whether it was a tab, control
@ -75,6 +75,7 @@ wgetnstr_events(WINDOW *win,
int maxlen,
EVENTLIST_1st(_nc_eventlist * evl))
{
SCREEN *sp = _nc_screen_of(win);
TTY buf;
bool oldnl, oldecho, oldraw, oldcbreak;
char erasec;
@ -90,10 +91,10 @@ wgetnstr_events(WINDOW *win,
_nc_get_tty_mode(&buf);
oldnl = SP->_nl;
oldecho = SP->_echo;
oldraw = SP->_raw;
oldcbreak = SP->_cbreak;
oldnl = sp->_nl;
oldecho = sp->_echo;
oldraw = sp->_raw;
oldcbreak = sp->_cbreak;
nl();
noecho();
noraw();
@ -187,10 +188,10 @@ wgetnstr_events(WINDOW *win,
/* Restore with a single I/O call, to fix minor asymmetry between
* raw/noraw, etc.
*/
SP->_nl = oldnl;
SP->_echo = oldecho;
SP->_raw = oldraw;
SP->_cbreak = oldcbreak;
sp->_nl = oldnl;
sp->_echo = oldecho;
sp->_raw = oldraw;
sp->_cbreak = oldcbreak;
_nc_set_tty_mode(&buf);

View File

@ -1,5 +1,5 @@
/****************************************************************************
* Copyright (c) 1998-2006,2007 Free Software Foundation, Inc. *
* Copyright (c) 1998-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 *
@ -79,7 +79,7 @@
#include <curses.priv.h>
MODULE_ID("$Id: lib_mouse.c,v 1.88 2007/09/29 21:50:04 tom Exp $")
MODULE_ID("$Id: lib_mouse.c,v 1.94 2008/05/31 20:30:10 tom Exp $")
#include <term.h>
#include <tic.h>
@ -154,34 +154,34 @@ make an error
#endif /* USE_GPM_SUPPORT */
static bool _nc_mouse_parse(int);
static bool _nc_mouse_parse(SCREEN *, int);
static void _nc_mouse_resume(SCREEN *);
static void _nc_mouse_wrap(SCREEN *);
/* maintain a circular list of mouse events */
#undef NEXT
#define NEXT(ep) ((ep == SP->_mouse_events + EV_MAX - 1) \
? SP->_mouse_events \
#define NEXT(ep) ((ep == sp->_mouse_events + EV_MAX - 1) \
? sp->_mouse_events \
: ep + 1)
#undef PREV
#define PREV(ep) ((ep == SP->_mouse_events) \
? SP->_mouse_events + EV_MAX - 1 \
#define PREV(ep) ((ep == sp->_mouse_events) \
? sp->_mouse_events + EV_MAX - 1 \
: ep - 1)
#ifdef TRACE
static void
_trace_slot(const char *tag)
_trace_slot(SCREEN *sp, const char *tag)
{
MEVENT *ep;
_tracef(tag);
for (ep = SP->_mouse_events; ep < SP->_mouse_events + EV_MAX; ep++)
for (ep = sp->_mouse_events; ep < sp->_mouse_events + EV_MAX; ep++)
_tracef("mouse event queue slot %ld = %s",
(long) (ep - SP->_mouse_events),
_tracemouse(ep));
(long) (ep - sp->_mouse_events),
_nc_tracemouse(sp, ep));
}
#endif
@ -193,7 +193,7 @@ _trace_slot(const char *tag)
# define M_FD(sp) sp->_mouse_fd
static void
write_event(int down, int button, int x, int y)
write_event(SCREEN *sp, int down, int button, int x, int y)
{
char buf[6];
unsigned long ignore;
@ -202,12 +202,13 @@ write_event(int down, int button, int x, int y)
buf[3] = ' ' + (button - 1) + (down ? 0 : 0x40);
buf[4] = ' ' + x - LEFT_COL + 1;
buf[5] = ' ' + y - TOP_ROW + 1;
DosWrite(SP->_emxmouse_wfd, buf, 6, &ignore);
DosWrite(sp->_emxmouse_wfd, buf, 6, &ignore);
}
static void
mouse_server(unsigned long ignored GCC_UNUSED)
mouse_server(unsigned long param)
{
SCREEN *sp = (SCREEN *) param;
unsigned short fWait = MOU_WAIT;
/* NOPTRRECT mourt = { 0,0,24,79 }; */
MOUEVENTINFO mouev;
@ -234,7 +235,7 @@ mouse_server(unsigned long ignored GCC_UNUSED)
sprintf(err, "Error reading mouse queue, rc=%lu.\r\n", rc);
break;
}
if (!SP->_emxmouse_activated)
if (!sp->_emxmouse_activated)
goto finish;
/*
@ -246,13 +247,13 @@ mouse_server(unsigned long ignored GCC_UNUSED)
*/
if ((mouev.fs ^ oldstate) & MOUSE_BN1_DOWN)
write_event(mouev.fs & MOUSE_BN1_DOWN,
SP->_emxmouse_buttons[1], mouev.col, mouev.row);
sp->_emxmouse_buttons[1], mouev.col, mouev.row);
if ((mouev.fs ^ oldstate) & MOUSE_BN2_DOWN)
write_event(mouev.fs & MOUSE_BN2_DOWN,
SP->_emxmouse_buttons[3], mouev.col, mouev.row);
sp->_emxmouse_buttons[3], mouev.col, mouev.row);
if ((mouev.fs ^ oldstate) & MOUSE_BN3_DOWN)
write_event(mouev.fs & MOUSE_BN3_DOWN,
SP->_emxmouse_buttons[2], mouev.col, mouev.row);
sp->_emxmouse_buttons[2], mouev.col, mouev.row);
finish:
oldstate = mouev.fs;
@ -271,81 +272,87 @@ mouse_server(unsigned long ignored GCC_UNUSED)
#if USE_SYSMOUSE
static void
handle_sysmouse(int sig GCC_UNUSED)
sysmouse_server(SCREEN *sp)
{
struct mouse_info the_mouse;
MEVENT *work;
the_mouse.operation = MOUSE_GETINFO;
if (SP != 0
&& SP->_mouse_fd >= 0
&& SP->_sysmouse_tail < FIFO_SIZE
&& ioctl(SP->_mouse_fd, CONS_MOUSECTL, &the_mouse) != -1) {
if (sp != 0
&& sp->_mouse_fd >= 0
&& sp->_sysmouse_tail < FIFO_SIZE
&& ioctl(sp->_mouse_fd, CONS_MOUSECTL, &the_mouse) != -1) {
if (SP->_sysmouse_head > SP->_sysmouse_tail) {
SP->_sysmouse_tail = 0;
SP->_sysmouse_head = 0;
if (sp->_sysmouse_head > sp->_sysmouse_tail) {
sp->_sysmouse_tail = 0;
sp->_sysmouse_head = 0;
}
work = &(SP->_sysmouse_fifo[SP->_sysmouse_tail]);
work = &(sp->_sysmouse_fifo[sp->_sysmouse_tail]);
memset(work, 0, sizeof(*work));
work->id = NORMAL_EVENT; /* there's only one mouse... */
SP->_sysmouse_old_buttons = SP->_sysmouse_new_buttons;
SP->_sysmouse_new_buttons = the_mouse.u.data.buttons & 0x7;
sp->_sysmouse_old_buttons = sp->_sysmouse_new_buttons;
sp->_sysmouse_new_buttons = the_mouse.u.data.buttons & 0x7;
if (SP->_sysmouse_new_buttons) {
if (SP->_sysmouse_new_buttons & 1)
if (sp->_sysmouse_new_buttons) {
if (sp->_sysmouse_new_buttons & 1)
work->bstate |= BUTTON1_PRESSED;
if (SP->_sysmouse_new_buttons & 2)
if (sp->_sysmouse_new_buttons & 2)
work->bstate |= BUTTON2_PRESSED;
if (SP->_sysmouse_new_buttons & 4)
if (sp->_sysmouse_new_buttons & 4)
work->bstate |= BUTTON3_PRESSED;
} else {
if (SP->_sysmouse_old_buttons & 1)
if (sp->_sysmouse_old_buttons & 1)
work->bstate |= BUTTON1_RELEASED;
if (SP->_sysmouse_old_buttons & 2)
if (sp->_sysmouse_old_buttons & 2)
work->bstate |= BUTTON2_RELEASED;
if (SP->_sysmouse_old_buttons & 4)
if (sp->_sysmouse_old_buttons & 4)
work->bstate |= BUTTON3_RELEASED;
}
/* for cosmetic bug in syscons.c on FreeBSD 3.[34] */
the_mouse.operation = MOUSE_HIDE;
ioctl(SP->_mouse_fd, CONS_MOUSECTL, &the_mouse);
ioctl(sp->_mouse_fd, CONS_MOUSECTL, &the_mouse);
the_mouse.operation = MOUSE_SHOW;
ioctl(SP->_mouse_fd, CONS_MOUSECTL, &the_mouse);
ioctl(sp->_mouse_fd, CONS_MOUSECTL, &the_mouse);
/*
* We're only interested if the button is pressed or released.
* FIXME: implement continuous event-tracking.
*/
if (SP->_sysmouse_new_buttons != SP->_sysmouse_old_buttons) {
SP->_sysmouse_tail += 1;
if (sp->_sysmouse_new_buttons != sp->_sysmouse_old_buttons) {
sp->_sysmouse_tail += 1;
}
work->x = the_mouse.u.data.x / SP->_sysmouse_char_width;
work->y = the_mouse.u.data.y / SP->_sysmouse_char_height;
work->x = the_mouse.u.data.x / sp->_sysmouse_char_width;
work->y = the_mouse.u.data.y / sp->_sysmouse_char_height;
}
}
static void
handle_sysmouse(int sig GCC_UNUSED)
{
sysmouse_server(SP);
}
#endif /* USE_SYSMOUSE */
static void
init_xterm_mouse(void)
init_xterm_mouse(SCREEN *sp)
{
SP->_mouse_type = M_XTERM;
SP->_mouse_xtermcap = tigetstr("XM");
if (!VALID_STRING(SP->_mouse_xtermcap))
SP->_mouse_xtermcap = "\033[?1000%?%p1%{1}%=%th%el%;";
sp->_mouse_type = M_XTERM;
sp->_mouse_xtermcap = tigetstr("XM");
if (!VALID_STRING(sp->_mouse_xtermcap))
sp->_mouse_xtermcap = "\033[?1000%?%p1%{1}%=%th%el%;";
}
static void
enable_xterm_mouse(int enable)
enable_xterm_mouse(SCREEN *sp, int enable)
{
#if USE_EMX_MOUSE
SP->_emxmouse_activated = enable;
sp->_emxmouse_activated = enable;
#else
putp(TPARM_1(SP->_mouse_xtermcap, enable));
putp(TPARM_1(sp->_mouse_xtermcap, enable));
#endif
SP->_mouse_active = enable;
sp->_mouse_active = enable;
}
#if USE_GPM_SUPPORT
@ -366,19 +373,19 @@ allow_gpm_mouse(void)
}
static bool
enable_gpm_mouse(int enable)
enable_gpm_mouse(SCREEN *sp, int enable)
{
bool result;
T((T_CALLED("enable_gpm_mouse(%d)"), enable));
if (enable && !SP->_mouse_active) {
if (enable && !sp->_mouse_active) {
/* GPM: initialize connection to gpm server */
SP->_mouse_gpm_connect.eventMask = GPM_DOWN | GPM_UP;
SP->_mouse_gpm_connect.defaultMask =
~(SP->_mouse_gpm_connect.eventMask | GPM_HARD);
SP->_mouse_gpm_connect.minMod = 0;
SP->_mouse_gpm_connect.maxMod =
sp->_mouse_gpm_connect.eventMask = GPM_DOWN | GPM_UP;
sp->_mouse_gpm_connect.defaultMask =
~(sp->_mouse_gpm_connect.eventMask | GPM_HARD);
sp->_mouse_gpm_connect.minMod = 0;
sp->_mouse_gpm_connect.maxMod =
(unsigned short) (~((1 << KG_SHIFT) |
(1 << KG_SHIFTL) |
(1 << KG_SHIFTR)));
@ -387,14 +394,14 @@ enable_gpm_mouse(int enable)
* The former is recognized by wscons (SunOS), and the latter by
* xterm. Those will not show up in ncurses' traces.
*/
result = (my_Gpm_Open(&SP->_mouse_gpm_connect, 0) >= 0);
SP->_mouse_active = result;
result = (my_Gpm_Open(&sp->_mouse_gpm_connect, 0) >= 0);
sp->_mouse_active = result;
T(("GPM open %s", result ? "succeeded" : "failed"));
} else {
if (!enable && SP->_mouse_active) {
if (!enable && sp->_mouse_active) {
/* GPM: close connection to gpm server */
my_Gpm_Close();
SP->_mouse_active = FALSE;
sp->_mouse_active = FALSE;
T(("GPM closed"));
}
result = FALSE;
@ -406,14 +413,14 @@ enable_gpm_mouse(int enable)
#define xterm_kmous "\033[M"
static void
initialize_mousetype(void)
initialize_mousetype(SCREEN *sp)
{
T((T_CALLED("initialize_mousetype()")));
/* Try gpm first, because gpm may be configured to run in xterm */
#if USE_GPM_SUPPORT
if (allow_gpm_mouse()) {
if (!SP->_mouse_gpm_loaded) {
if (!sp->_mouse_gpm_loaded) {
#ifdef HAVE_LIBDL
void *obj;
@ -425,13 +432,13 @@ initialize_mousetype(void)
T(("GPM initialization failed: %s", dlerror()));
dlclose(obj);
} else {
SP->_mouse_gpm_found = TRUE;
sp->_mouse_gpm_found = TRUE;
}
}
#else /* !HAVE_LIBDL */
SP->_mouse_gpm_found = TRUE;
sp->_mouse_gpm_found = TRUE;
#endif
SP->_mouse_gpm_loaded = TRUE;
sp->_mouse_gpm_loaded = TRUE;
}
/*
@ -439,10 +446,10 @@ initialize_mousetype(void)
* maintain our notion of whether the mouse connection is active
* without testing the file-descriptor.
*/
if (SP->_mouse_gpm_found && enable_gpm_mouse(TRUE)) {
SP->_mouse_type = M_GPM;
SP->_mouse_fd = *(my_gpm_fd);
T(("GPM mouse_fd %d", SP->_mouse_fd));
if (sp->_mouse_gpm_found && enable_gpm_mouse(sp, TRUE)) {
sp->_mouse_type = M_GPM;
sp->_mouse_fd = *(my_gpm_fd);
T(("GPM mouse_fd %d", sp->_mouse_fd));
returnVoid;
}
}
@ -450,7 +457,7 @@ initialize_mousetype(void)
/* OS/2 VIO */
#if USE_EMX_MOUSE
if (!SP->_emxmouse_thread
if (!sp->_emxmouse_thread
&& strstr(cur_term->type.term_names, "xterm") == 0
&& key_mouse) {
int handles[2];
@ -461,32 +468,32 @@ initialize_mousetype(void)
} else {
int rc;
if (!SP->_emxmouse_buttons[0]) {
if (!sp->_emxmouse_buttons[0]) {
char *s = getenv("MOUSE_BUTTONS_123");
SP->_emxmouse_buttons[0] = 1;
sp->_emxmouse_buttons[0] = 1;
if (s && strlen(s) >= 3) {
SP->_emxmouse_buttons[1] = s[0] - '0';
SP->_emxmouse_buttons[2] = s[1] - '0';
SP->_emxmouse_buttons[3] = s[2] - '0';
sp->_emxmouse_buttons[1] = s[0] - '0';
sp->_emxmouse_buttons[2] = s[1] - '0';
sp->_emxmouse_buttons[3] = s[2] - '0';
} else {
SP->_emxmouse_buttons[1] = 1;
SP->_emxmouse_buttons[2] = 3;
SP->_emxmouse_buttons[3] = 2;
sp->_emxmouse_buttons[1] = 1;
sp->_emxmouse_buttons[2] = 3;
sp->_emxmouse_buttons[3] = 2;
}
}
SP->_emxmouse_wfd = handles[1];
M_FD(SP) = handles[0];
sp->_emxmouse_wfd = handles[1];
M_FD(sp) = handles[0];
/* Needed? */
setmode(handles[0], O_BINARY);
setmode(handles[1], O_BINARY);
/* Do not use CRT functions, we may single-threaded. */
rc = DosCreateThread((unsigned long *) &SP->_emxmouse_thread,
mouse_server, 0, 0, 8192);
rc = DosCreateThread((unsigned long *) &sp->_emxmouse_thread,
mouse_server, sp, 0, 8192);
if (rc) {
printf("mouse thread error %d=%#x", rc, rc);
} else {
SP->_mouse_type = M_XTERM;
sp->_mouse_type = M_XTERM;
}
returnVoid;
}
@ -498,14 +505,14 @@ initialize_mousetype(void)
struct mouse_info the_mouse;
char *the_device = 0;
if (isatty(SP->_ifd))
the_device = ttyname(SP->_ifd);
if (isatty(sp->_ifd))
the_device = ttyname(sp->_ifd);
if (the_device == 0)
the_device = "/dev/tty";
SP->_mouse_fd = open(the_device, O_RDWR);
sp->_mouse_fd = open(the_device, O_RDWR);
if (SP->_mouse_fd >= 0) {
if (sp->_mouse_fd >= 0) {
/*
* sysmouse does not have a usable user interface for obtaining
* mouse events. The logical way to proceed (reading data on a
@ -522,10 +529,10 @@ initialize_mousetype(void)
the_mouse.operation = MOUSE_MODE;
the_mouse.u.mode.mode = 0;
the_mouse.u.mode.signal = SIGUSR2;
if (ioctl(SP->_mouse_fd, CONS_MOUSECTL, &the_mouse) != -1) {
if (ioctl(sp->_mouse_fd, CONS_MOUSECTL, &the_mouse) != -1) {
signal(SIGUSR2, handle_sysmouse);
the_mouse.operation = MOUSE_SHOW;
ioctl(SP->_mouse_fd, CONS_MOUSECTL, &the_mouse);
ioctl(sp->_mouse_fd, CONS_MOUSECTL, &the_mouse);
#if defined(FBIO_MODEINFO) || defined(CONS_MODEINFO) /* FreeBSD > 2.x */
{
@ -535,23 +542,23 @@ initialize_mousetype(void)
#endif /* FBIO_GETMODE */
video_info_t the_video;
if (ioctl(SP->_mouse_fd,
if (ioctl(sp->_mouse_fd,
FBIO_GETMODE,
&the_video.vi_mode) != -1
&& ioctl(SP->_mouse_fd,
&& ioctl(sp->_mouse_fd,
FBIO_MODEINFO,
&the_video) != -1) {
SP->_sysmouse_char_width = the_video.vi_cwidth;
SP->_sysmouse_char_height = the_video.vi_cheight;
sp->_sysmouse_char_width = the_video.vi_cwidth;
sp->_sysmouse_char_height = the_video.vi_cheight;
}
}
#endif /* defined(FBIO_MODEINFO) || defined(CONS_MODEINFO) */
if (SP->_sysmouse_char_width <= 0)
SP->_sysmouse_char_width = 8;
if (SP->_sysmouse_char_height <= 0)
SP->_sysmouse_char_height = 16;
SP->_mouse_type = M_SYSMOUSE;
if (sp->_sysmouse_char_width <= 0)
sp->_sysmouse_char_width = 8;
if (sp->_sysmouse_char_height <= 0)
sp->_sysmouse_char_height = 16;
sp->_mouse_type = M_SYSMOUSE;
returnVoid;
}
}
@ -562,37 +569,37 @@ initialize_mousetype(void)
if (key_mouse != 0) {
if (!strcmp(key_mouse, xterm_kmous)
|| strstr(cur_term->type.term_names, "xterm") != 0) {
init_xterm_mouse();
init_xterm_mouse(sp);
}
} else if (strstr(cur_term->type.term_names, "xterm") != 0) {
if (_nc_add_to_try(&(SP->_keytry), xterm_kmous, KEY_MOUSE) == OK)
init_xterm_mouse();
if (_nc_add_to_try(&(sp->_keytry), xterm_kmous, KEY_MOUSE) == OK)
init_xterm_mouse(sp);
}
returnVoid;
}
static bool
_nc_mouse_init(void)
_nc_mouse_init(SCREEN *sp)
/* initialize the mouse */
{
bool result = FALSE;
int i;
if (SP != 0) {
if (!SP->_mouse_initialized) {
SP->_mouse_initialized = TRUE;
if (sp != 0) {
if (!sp->_mouse_initialized) {
sp->_mouse_initialized = TRUE;
TR(MY_TRACE, ("_nc_mouse_init() called"));
SP->_mouse_eventp = SP->_mouse_events;
sp->_mouse_eventp = sp->_mouse_events;
for (i = 0; i < EV_MAX; i++)
SP->_mouse_events[i].id = INVALID_EVENT;
sp->_mouse_events[i].id = INVALID_EVENT;
initialize_mousetype();
initialize_mousetype(sp);
T(("_nc_mouse_init() set mousetype to %d", SP->_mouse_type));
T(("_nc_mouse_init() set mousetype to %d", sp->_mouse_type));
}
result = SP->_mouse_initialized;
result = sp->_mouse_initialized;
}
return result;
}
@ -604,12 +611,12 @@ _nc_mouse_init(void)
static bool
_nc_mouse_event(SCREEN *sp GCC_UNUSED)
{
MEVENT *eventp = SP->_mouse_eventp;
MEVENT *eventp = sp->_mouse_eventp;
bool result = FALSE;
(void) eventp;
switch (SP->_mouse_type) {
switch (sp->_mouse_type) {
case M_XTERM:
/* xterm: never have to query, mouse events are in the keyboard stream */
#if USE_EMX_MOUSE
@ -666,7 +673,7 @@ _nc_mouse_event(SCREEN *sp GCC_UNUSED)
eventp->z = 0;
/* bump the next-free pointer into the circular list */
SP->_mouse_eventp = eventp = NEXT(eventp);
sp->_mouse_eventp = eventp = NEXT(eventp);
result = TRUE;
}
}
@ -675,22 +682,22 @@ _nc_mouse_event(SCREEN *sp GCC_UNUSED)
#if USE_SYSMOUSE
case M_SYSMOUSE:
if (SP->_sysmouse_head < SP->_sysmouse_tail) {
*eventp = SP->_sysmouse_fifo[SP->_sysmouse_head];
if (sp->_sysmouse_head < sp->_sysmouse_tail) {
*eventp = sp->_sysmouse_fifo[sp->_sysmouse_head];
/*
* Point the fifo-head to the next possible location. If there
* are none, reset the indices. This may be interrupted by the
* signal handler, doing essentially the same reset.
*/
SP->_sysmouse_head += 1;
if (SP->_sysmouse_head == SP->_sysmouse_tail) {
SP->_sysmouse_tail = 0;
SP->_sysmouse_head = 0;
sp->_sysmouse_head += 1;
if (sp->_sysmouse_head == sp->_sysmouse_tail) {
sp->_sysmouse_tail = 0;
sp->_sysmouse_head = 0;
}
/* bump the next-free pointer into the circular list */
SP->_mouse_eventp = eventp = NEXT(eventp);
sp->_mouse_eventp = eventp = NEXT(eventp);
result = TRUE;
}
break;
@ -709,11 +716,11 @@ _nc_mouse_inline(SCREEN *sp)
{
int b;
bool result = FALSE;
MEVENT *eventp = SP->_mouse_eventp;
MEVENT *eventp = sp->_mouse_eventp;
TR(MY_TRACE, ("_nc_mouse_inline() called"));
if (SP->_mouse_type == M_XTERM) {
if (sp->_mouse_type == M_XTERM) {
unsigned char kbuf[4];
mmask_t prev;
size_t grabbed;
@ -847,11 +854,11 @@ _nc_mouse_inline(SCREEN *sp)
eventp->y = (kbuf[2] - ' ') - 1;
TR(MY_TRACE,
("_nc_mouse_inline: primitive mouse-event %s has slot %ld",
_tracemouse(eventp),
(long) (eventp - SP->_mouse_events)));
_nc_tracemouse(sp, eventp),
(long) (eventp - sp->_mouse_events)));
/* bump the next-free pointer into the circular list */
SP->_mouse_eventp = NEXT(eventp);
sp->_mouse_eventp = NEXT(eventp);
#if 0 /* this return would be needed for QNX's mods to lib_getch.c */
return (TRUE);
#endif
@ -861,36 +868,36 @@ _nc_mouse_inline(SCREEN *sp)
}
static void
mouse_activate(bool on)
mouse_activate(SCREEN *sp, bool on)
{
if (!on && !SP->_mouse_initialized)
if (!on && !sp->_mouse_initialized)
return;
if (!_nc_mouse_init())
if (!_nc_mouse_init(sp))
return;
if (on) {
switch (SP->_mouse_type) {
switch (sp->_mouse_type) {
case M_XTERM:
#if NCURSES_EXT_FUNCS
keyok(KEY_MOUSE, on);
#endif
TPUTS_TRACE("xterm mouse initialization");
enable_xterm_mouse(1);
enable_xterm_mouse(sp, 1);
break;
#if USE_GPM_SUPPORT
case M_GPM:
if (enable_gpm_mouse(1)) {
SP->_mouse_fd = *(my_gpm_fd);
T(("GPM mouse_fd %d", SP->_mouse_fd));
if (enable_gpm_mouse(sp, 1)) {
sp->_mouse_fd = *(my_gpm_fd);
T(("GPM mouse_fd %d", sp->_mouse_fd));
}
break;
#endif
#if USE_SYSMOUSE
case M_SYSMOUSE:
signal(SIGUSR2, handle_sysmouse);
SP->_mouse_active = TRUE;
sp->_mouse_active = TRUE;
break;
#endif
case M_NONE:
@ -899,27 +906,27 @@ mouse_activate(bool on)
/* Make runtime binding to cut down on object size of applications that
* do not use the mouse (e.g., 'clear').
*/
SP->_mouse_event = _nc_mouse_event;
SP->_mouse_inline = _nc_mouse_inline;
SP->_mouse_parse = _nc_mouse_parse;
SP->_mouse_resume = _nc_mouse_resume;
SP->_mouse_wrap = _nc_mouse_wrap;
sp->_mouse_event = _nc_mouse_event;
sp->_mouse_inline = _nc_mouse_inline;
sp->_mouse_parse = _nc_mouse_parse;
sp->_mouse_resume = _nc_mouse_resume;
sp->_mouse_wrap = _nc_mouse_wrap;
} else {
switch (SP->_mouse_type) {
switch (sp->_mouse_type) {
case M_XTERM:
TPUTS_TRACE("xterm mouse deinitialization");
enable_xterm_mouse(0);
enable_xterm_mouse(sp, 0);
break;
#if USE_GPM_SUPPORT
case M_GPM:
enable_gpm_mouse(0);
enable_gpm_mouse(sp, 0);
break;
#endif
#if USE_SYSMOUSE
case M_SYSMOUSE:
signal(SIGUSR2, SIG_IGN);
SP->_mouse_active = FALSE;
sp->_mouse_active = FALSE;
break;
#endif
case M_NONE:
@ -936,10 +943,10 @@ mouse_activate(bool on)
**************************************************************************/
static bool
_nc_mouse_parse(int runcount)
_nc_mouse_parse(SCREEN *sp, int runcount)
/* parse a run of atomic mouse events into a gesture */
{
MEVENT *eventp = SP->_mouse_eventp;
MEVENT *eventp = sp->_mouse_eventp;
MEVENT *ep, *runp, *next, *prev = PREV(eventp);
int n;
int b;
@ -971,10 +978,10 @@ _nc_mouse_parse(int runcount)
if (runcount == 1) {
TR(MY_TRACE,
("_nc_mouse_parse: returning simple mouse event %s at slot %ld",
_tracemouse(prev),
(long) (prev - SP->_mouse_events)));
_nc_tracemouse(sp, prev),
(long) (prev - sp->_mouse_events)));
return (prev->id >= NORMAL_EVENT)
? ((prev->bstate & SP->_mouse_mask) ? TRUE : FALSE)
? ((prev->bstate & sp->_mouse_mask) ? TRUE : FALSE)
: FALSE;
}
@ -986,10 +993,10 @@ _nc_mouse_parse(int runcount)
#ifdef TRACE
if (USE_TRACEF(TRACE_IEVENT)) {
_trace_slot("before mouse press/release merge:");
_trace_slot(sp, "before mouse press/release merge:");
_tracef("_nc_mouse_parse: run starts at %ld, ends at %ld, count %d",
(long) (runp - SP->_mouse_events),
(long) ((eventp - SP->_mouse_events) + (EV_MAX - 1)) % EV_MAX,
(long) (runp - sp->_mouse_events),
(long) ((eventp - sp->_mouse_events) + (EV_MAX - 1)) % EV_MAX,
runcount);
_nc_unlock_global(tracef);
}
@ -1014,7 +1021,7 @@ _nc_mouse_parse(int runcount)
#endif
) {
for (b = 1; b <= MAX_BUTTONS; ++b) {
if ((SP->_mouse_mask & MASK_CLICK(b))
if ((sp->_mouse_mask & MASK_CLICK(b))
&& (ep->bstate & MASK_PRESS(b))) {
ep->bstate &= ~MASK_PRESS(b);
ep->bstate |= MASK_CLICK(b);
@ -1030,10 +1037,10 @@ _nc_mouse_parse(int runcount)
#ifdef TRACE
if (USE_TRACEF(TRACE_IEVENT)) {
_trace_slot("before mouse click merge:");
_trace_slot(sp, "before mouse click merge:");
_tracef("_nc_mouse_parse: run starts at %ld, ends at %ld, count %d",
(long) (runp - SP->_mouse_events),
(long) ((eventp - SP->_mouse_events) + (EV_MAX - 1)) % EV_MAX,
(long) (runp - sp->_mouse_events),
(long) ((eventp - sp->_mouse_events) + (EV_MAX - 1)) % EV_MAX,
runcount);
_nc_unlock_global(tracef);
}
@ -1071,7 +1078,7 @@ _nc_mouse_parse(int runcount)
if ((ep->bstate & BUTTON_CLICKED)
&& (follower->bstate & BUTTON_CLICKED)) {
for (b = 1; b <= MAX_BUTTONS; ++b) {
if ((SP->_mouse_mask & MASK_DOUBLE_CLICK(b))
if ((sp->_mouse_mask & MASK_DOUBLE_CLICK(b))
&& (follower->bstate & MASK_CLICK(b))) {
follower->bstate &= ~MASK_CLICK(b);
follower->bstate |= MASK_DOUBLE_CLICK(b);
@ -1086,7 +1093,7 @@ _nc_mouse_parse(int runcount)
if ((ep->bstate & BUTTON_DOUBLE_CLICKED)
&& (follower->bstate & BUTTON_CLICKED)) {
for (b = 1; b <= MAX_BUTTONS; ++b) {
if ((SP->_mouse_mask & MASK_TRIPLE_CLICK(b))
if ((sp->_mouse_mask & MASK_TRIPLE_CLICK(b))
&& (follower->bstate & MASK_CLICK(b))) {
follower->bstate &= ~MASK_CLICK(b);
follower->bstate |= MASK_TRIPLE_CLICK(b);
@ -1102,10 +1109,10 @@ _nc_mouse_parse(int runcount)
#ifdef TRACE
if (USE_TRACEF(TRACE_IEVENT)) {
_trace_slot("before mouse event queue compaction:");
_trace_slot(sp, "before mouse event queue compaction:");
_tracef("_nc_mouse_parse: run starts at %ld, ends at %ld, count %d",
(long) (runp - SP->_mouse_events),
(long) ((eventp - SP->_mouse_events) + (EV_MAX - 1)) % EV_MAX,
(long) (runp - sp->_mouse_events),
(long) ((eventp - sp->_mouse_events) + (EV_MAX - 1)) % EV_MAX,
runcount);
_nc_unlock_global(tracef);
}
@ -1116,15 +1123,15 @@ _nc_mouse_parse(int runcount)
* don't match the current event mask.
*/
for (; runcount; prev = PREV(eventp), runcount--)
if (prev->id == INVALID_EVENT || !(prev->bstate & SP->_mouse_mask)) {
SP->_mouse_eventp = eventp = prev;
if (prev->id == INVALID_EVENT || !(prev->bstate & sp->_mouse_mask)) {
sp->_mouse_eventp = eventp = prev;
}
#ifdef TRACE
if (USE_TRACEF(TRACE_IEVENT)) {
_trace_slot("after mouse event queue compaction:");
_trace_slot(sp, "after mouse event queue compaction:");
_tracef("_nc_mouse_parse: run starts at %ld, ends at %ld, count %d",
(long) (runp - SP->_mouse_events),
(long) ((eventp - SP->_mouse_events) + (EV_MAX - 1)) % EV_MAX,
(long) (runp - sp->_mouse_events),
(long) ((eventp - sp->_mouse_events) + (EV_MAX - 1)) % EV_MAX,
runcount);
_nc_unlock_global(tracef);
}
@ -1132,8 +1139,8 @@ _nc_mouse_parse(int runcount)
if (ep->id != INVALID_EVENT)
TR(MY_TRACE,
("_nc_mouse_parse: returning composite mouse event %s at slot %ld",
_tracemouse(ep),
(long) (ep - SP->_mouse_events)));
_nc_tracemouse(sp, ep),
(long) (ep - sp->_mouse_events)));
#endif /* TRACE */
/* after all this, do we have a valid event? */
@ -1141,26 +1148,26 @@ _nc_mouse_parse(int runcount)
}
static void
_nc_mouse_wrap(SCREEN *sp GCC_UNUSED)
_nc_mouse_wrap(SCREEN *sp)
/* release mouse -- called by endwin() before shellout/exit */
{
TR(MY_TRACE, ("_nc_mouse_wrap() called"));
switch (SP->_mouse_type) {
switch (sp->_mouse_type) {
case M_XTERM:
if (SP->_mouse_mask)
mouse_activate(FALSE);
if (sp->_mouse_mask)
mouse_activate(sp, FALSE);
break;
#if USE_GPM_SUPPORT
/* GPM: pass all mouse events to next client */
case M_GPM:
if (SP->_mouse_mask)
mouse_activate(FALSE);
if (sp->_mouse_mask)
mouse_activate(sp, FALSE);
break;
#endif
#if USE_SYSMOUSE
case M_SYSMOUSE:
mouse_activate(FALSE);
mouse_activate(sp, FALSE);
break;
#endif
case M_NONE:
@ -1169,29 +1176,29 @@ _nc_mouse_wrap(SCREEN *sp GCC_UNUSED)
}
static void
_nc_mouse_resume(SCREEN *sp GCC_UNUSED)
_nc_mouse_resume(SCREEN *sp)
/* re-connect to mouse -- called by doupdate() after shellout */
{
TR(MY_TRACE, ("_nc_mouse_resume() called"));
switch (SP->_mouse_type) {
switch (sp->_mouse_type) {
case M_XTERM:
/* xterm: re-enable reporting */
if (SP->_mouse_mask)
mouse_activate(TRUE);
if (sp->_mouse_mask)
mouse_activate(sp, TRUE);
break;
#if USE_GPM_SUPPORT
case M_GPM:
/* GPM: reclaim our event set */
if (SP->_mouse_mask)
mouse_activate(TRUE);
if (sp->_mouse_mask)
mouse_activate(sp, TRUE);
break;
#endif
#if USE_SYSMOUSE
case M_SYSMOUSE:
mouse_activate(TRUE);
mouse_activate(sp, TRUE);
break;
#endif
case M_NONE:
@ -1205,14 +1212,13 @@ _nc_mouse_resume(SCREEN *sp GCC_UNUSED)
*
**************************************************************************/
NCURSES_EXPORT(int)
getmouse(MEVENT * aevent)
/* grab a copy of the current mouse event */
static int
_nc_getmouse(SCREEN *sp, MEVENT * aevent)
{
T((T_CALLED("getmouse(%p)"), aevent));
if ((aevent != 0) && (SP != 0) && (SP->_mouse_type != M_NONE)) {
MEVENT *eventp = SP->_mouse_eventp;
if ((aevent != 0) && (sp != 0) && (sp->_mouse_type != M_NONE)) {
MEVENT *eventp = sp->_mouse_eventp;
/* compute the current-event pointer */
MEVENT *prev = PREV(eventp);
@ -1220,8 +1226,8 @@ getmouse(MEVENT * aevent)
*aevent = *prev;
TR(TRACE_IEVENT, ("getmouse: returning event %s from slot %ld",
_tracemouse(prev),
(long) (prev - SP->_mouse_events)));
_nc_tracemouse(sp, prev),
(long) (prev - sp->_mouse_events)));
prev->id = INVALID_EVENT; /* so the queue slot becomes free */
returnCode(OK);
@ -1229,29 +1235,42 @@ getmouse(MEVENT * aevent)
returnCode(ERR);
}
/* grab a copy of the current mouse event */
NCURSES_EXPORT(int)
ungetmouse(MEVENT * aevent)
/* enqueue a synthesized mouse event to be seen by the next wgetch() */
getmouse(MEVENT * aevent)
{
return _nc_getmouse(SP, aevent);
}
static int
_nc_ungetmouse(SCREEN *sp, MEVENT * aevent)
{
int result = ERR;
T((T_CALLED("ungetmouse(%p)"), aevent));
if (aevent != 0 && SP != 0) {
MEVENT *eventp = SP->_mouse_eventp;
if (aevent != 0 && sp != 0) {
MEVENT *eventp = sp->_mouse_eventp;
/* stick the given event in the next-free slot */
*eventp = *aevent;
/* bump the next-free pointer into the circular list */
SP->_mouse_eventp = NEXT(eventp);
sp->_mouse_eventp = NEXT(eventp);
/* push back the notification event on the keyboard queue */
result = ungetch(KEY_MOUSE);
result = _nc_ungetch(sp, KEY_MOUSE);
}
returnCode(result);
}
/* enqueue a synthesized mouse event to be seen by the next wgetch() */
NCURSES_EXPORT(int)
ungetmouse(MEVENT * aevent)
{
return _nc_ungetmouse(SP, aevent);
}
NCURSES_EXPORT(mmask_t)
mousemask(mmask_t newmask, mmask_t * oldmask)
/* set the mouse event mask */
@ -1265,7 +1284,7 @@ mousemask(mmask_t newmask, mmask_t * oldmask)
*oldmask = SP->_mouse_mask;
if (newmask || SP->_mouse_initialized) {
_nc_mouse_init();
_nc_mouse_init(SP);
if (SP->_mouse_type != M_NONE) {
result = newmask &
(REPORT_MOUSE_POSITION
@ -1278,7 +1297,7 @@ mousemask(mmask_t newmask, mmask_t * oldmask)
| BUTTON_DOUBLE_CLICKED
| BUTTON_TRIPLE_CLICKED);
mouse_activate((bool) (result != 0));
mouse_activate(SP, (bool) (result != 0));
SP->_mouse_mask = result;
}

View File

@ -42,7 +42,7 @@
#include <curses.priv.h>
#include <stddef.h>
MODULE_ID("$Id: lib_newwin.c,v 1.50 2008/05/03 16:36:39 tom Exp $")
MODULE_ID("$Id: lib_newwin.c,v 1.51 2008/05/31 21:50:09 tom Exp $")
#define window_is(name) ((sp)->_##name == win)
@ -313,6 +313,7 @@ _nc_makenew(int num_lines, int num_columns, int begy, int begx, int flags)
}
wp->next = _nc_windows;
wp->screen = SP;
_nc_windows = wp;
T((T_CREATE("window %p"), win));
@ -320,3 +321,20 @@ _nc_makenew(int num_lines, int num_columns, int begy, int begx, int flags)
_nc_unlock_global(windowlist);
returnWin(win);
}
/*
* wgetch() and other functions with a WINDOW* parameter may use a SCREEN*
* internally, and it is useful to allow those to be invoked without switching
* SCREEN's, e.g., for multi-threaded applications.
*/
NCURSES_EXPORT(SCREEN *)
_nc_screen_of(WINDOW *win)
{
SCREEN *sp = 0;
if (win != 0) {
WINDOWLIST *wp = (WINDOWLIST *) win;
sp = wp->screen;
}
return (sp);
}

View File

@ -44,7 +44,7 @@
#include <term.h> /* cur_term */
#include <tic.h>
MODULE_ID("$Id: lib_set_term.c,v 1.108 2008/05/03 22:42:43 tom Exp $")
MODULE_ID("$Id: lib_set_term.c,v 1.109 2008/05/31 20:11:26 tom Exp $")
NCURSES_EXPORT(SCREEN *)
set_term(SCREEN *screenp)
@ -212,7 +212,7 @@ no_mouse_inline(SCREEN *sp GCC_UNUSED)
}
static bool
no_mouse_parse(int code GCC_UNUSED)
no_mouse_parse(SCREEN *sp GCC_UNUSED, int code GCC_UNUSED)
{
return TRUE;
}

View File

@ -45,7 +45,7 @@
#include <ctype.h>
#include <term.h> /* num_labels, label_*, plab_norm */
MODULE_ID("$Id: lib_slk.c,v 1.31 2008/01/12 20:21:00 tom Exp $")
MODULE_ID("$Id: lib_slk.c,v 1.33 2008/05/31 22:05:57 tom Exp $")
/*
* We'd like to move these into the screen context structure, but cannot,
@ -60,14 +60,16 @@ _nc_slk_format = 0; /* one more than format specified in slk_init() */
static void
slk_paint_info(WINDOW *win)
{
if (win && SP->slk_format == 4) {
SCREEN *sp = _nc_screen_of(win);
if (win && sp && (sp->slk_format == 4)) {
int i;
mvwhline(win, 0, 0, 0, getmaxx(win));
wmove(win, 0, 0);
for (i = 0; i < SP->_slk->maxlab; i++) {
mvwprintw(win, 0, SP->_slk->ent[i].ent_x, "F%d", i + 1);
for (i = 0; i < sp->_slk->maxlab; i++) {
mvwprintw(win, 0, sp->_slk->ent[i].ent_x, "F%d", i + 1);
}
}
}

View File

@ -41,7 +41,7 @@
#include <curses.priv.h>
MODULE_ID("$Id: lib_ungetch.c,v 1.10 2008/05/03 20:20:58 tom Exp $")
MODULE_ID("$Id: lib_ungetch.c,v 1.11 2008/05/31 16:44:54 tom Exp $")
#include <fifo_defs.h>
@ -52,7 +52,7 @@ _nc_fifo_dump(SCREEN *sp)
int i;
T(("head = %d, tail = %d, peek = %d", head, tail, peek));
for (i = 0; i < 10; i++)
T(("char %d = %s", i, _tracechar(sp->_fifo[i])));
T(("char %d = %s", i, _nc_tracechar(sp, sp->_fifo[i])));
}
#endif /* TRACE */
@ -70,7 +70,7 @@ _nc_ungetch(SCREEN *sp, int ch)
h_dec();
sp->_fifo[head] = ch;
T(("ungetch %s ok", _tracechar(ch)));
T(("ungetch %s ok", _nc_tracechar(sp, ch)));
#ifdef TRACE
if (USE_TRACEF(TRACE_IEVENT)) {
_nc_fifo_dump(sp);
@ -85,6 +85,6 @@ _nc_ungetch(SCREEN *sp, int ch)
NCURSES_EXPORT(int)
ungetch(int ch)
{
T((T_CALLED("ungetch(%s)"), _tracechar(ch)));
T((T_CALLED("ungetch(%s)"), _nc_tracechar(SP, ch)));
returnCode(_nc_ungetch(SP, ch));
}

View File

@ -41,7 +41,7 @@
#include <curses.priv.h>
#include <term.h>
MODULE_ID("$Id: resizeterm.c,v 1.32 2008/05/03 14:28:55 tom Exp $")
MODULE_ID("$Id: resizeterm.c,v 1.33 2008/05/31 16:51:12 tom Exp $")
#define stolen_lines (screen_lines - SP->_lines_avail)
@ -418,7 +418,7 @@ resizeterm(int ToLines, int ToCols)
result = resize_term(ToLines, ToCols);
#if USE_SIGWINCH
ungetch(KEY_RESIZE); /* so application can know this */
_nc_ungetch(SP, KEY_RESIZE); /* so application can know this */
clearok(curscr, TRUE); /* screen contents are unknown */
/* ripped-off lines are a special case: if we did not lengthen

View File

@ -1,5 +1,5 @@
/****************************************************************************
* Copyright (c) 1998-2006,2007 Free Software Foundation, Inc. *
* Copyright (c) 1998-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 *
@ -39,7 +39,7 @@
#include <curses.priv.h>
MODULE_ID("$Id: tries.c,v 1.25 2007/09/29 20:37:13 tom Exp $")
MODULE_ID("$Id: tries.c,v 1.26 2008/05/31 16:54:22 tom Exp $")
/*
* Expand a keycode into the string that it corresponds to, returning null if
@ -72,7 +72,7 @@ _nc_expand_try(TRIES * tree, unsigned code, int *count, size_t len)
*((unsigned char *) (result + len)) = 128;
#ifdef TRACE
if (len == 0 && USE_TRACEF(TRACE_MAXIMUM)) {
_tracef("expand_key %s %s", _tracechar(code), _nc_visbuf(result));
_tracef("expand_key %s %s", _nc_tracechar(SP, code), _nc_visbuf(result));
_nc_unlock_global(tracef);
}
#endif

View File

@ -34,7 +34,7 @@
/*
* $Id: curses.priv.h,v 1.375 2008/05/24 23:08:27 tom Exp $
* $Id: curses.priv.h,v 1.382 2008/05/31 21:41:41 tom Exp $
*
* curses.priv.h
*
@ -603,8 +603,6 @@ typedef struct {
char *tracedmp_buf;
size_t tracedmp_used;
char tracemse_buf[TRACEMSE_MAX];
unsigned char *tracetry_buf;
size_t tracetry_used;
@ -796,7 +794,7 @@ struct screen {
int _maxclick;
bool (*_mouse_event) (SCREEN *);
bool (*_mouse_inline)(SCREEN *);
bool (*_mouse_parse) (int);
bool (*_mouse_parse) (SCREEN *, int);
void (*_mouse_resume)(SCREEN *);
void (*_mouse_wrap) (SCREEN *);
int _mouse_fd; /* file-descriptor, if any */
@ -873,6 +871,11 @@ struct screen {
long _outchars;
const char *_tputs_trace;
#endif
#endif
#ifdef TRACE
char tracechr_buf[40];
char tracemse_buf[TRACEMSE_MAX];
#endif
/*
* ncurses/ncursesw are the same up to this point.
@ -889,8 +892,9 @@ extern NCURSES_EXPORT_VAR(SCREEN *) _nc_screen_chain;
extern NCURSES_EXPORT_VAR(SIG_ATOMIC_T) _nc_have_sigwinch;
WINDOWLIST {
WINDOW win; /* first, so WINDOW_EXT() works */
WINDOW win; /* first, so WINDOW_EXT() works */
WINDOWLIST *next;
SCREEN *screen; /* screen containing the window */
#ifdef _XOPEN_SOURCE_EXTENDED
char addch_work[(MB_LEN_MAX * 9) + 1];
unsigned addch_used; /* number of bytes in addch_work[] */
@ -1533,10 +1537,15 @@ extern NCURSES_EXPORT(int) _nc_remove_key (TRIES **, unsigned);
extern NCURSES_EXPORT(int) _nc_remove_string (TRIES **, const char *);
/* elsewhere ... */
extern NCURSES_EXPORT(ENTRY *) _nc_delink_entry(ENTRY *, TERMTYPE *);
extern NCURSES_EXPORT(ENTRY *) _nc_delink_entry (ENTRY *, TERMTYPE *);
extern NCURSES_EXPORT(NCURSES_CONST char *) _nc_keyname (SCREEN *, int);
extern NCURSES_EXPORT(NCURSES_CONST char *) _nc_unctrl (SCREEN *, chtype);
extern NCURSES_EXPORT(SCREEN *) _nc_screen_of (WINDOW *);
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 *);
extern NCURSES_EXPORT(char *) _nc_tracechar (SCREEN *, int);
extern NCURSES_EXPORT(char *) _nc_tracemouse (SCREEN *, MEVENT const *);
extern NCURSES_EXPORT(int) _nc_access (const char *, int);
extern NCURSES_EXPORT(int) _nc_baudrate (int);
extern NCURSES_EXPORT(int) _nc_freewin (WINDOW *);
@ -1546,10 +1555,10 @@ extern NCURSES_EXPORT(int) _nc_ospeed (int);
extern NCURSES_EXPORT(int) _nc_outch (int);
extern NCURSES_EXPORT(int) _nc_read_termcap_entry (const char *const, TERMTYPE *const);
extern NCURSES_EXPORT(int) _nc_setupscreen (int, int, FILE *, bool, int);
extern NCURSES_EXPORT(int) _nc_timed_wait(SCREEN *, int, int, int * EVENTLIST_2nd(_nc_eventlist *));
extern NCURSES_EXPORT(int) _nc_timed_wait (SCREEN *, int, int, int * EVENTLIST_2nd(_nc_eventlist *));
extern NCURSES_EXPORT(void) _nc_do_color (short, short, bool, int (*)(int));
extern NCURSES_EXPORT(void) _nc_flush (void);
extern NCURSES_EXPORT(void) _nc_free_entry(ENTRY *, TERMTYPE *);
extern NCURSES_EXPORT(void) _nc_free_entry (ENTRY *, TERMTYPE *);
extern NCURSES_EXPORT(void) _nc_freeall (void);
extern NCURSES_EXPORT(void) _nc_hash_map (void);
extern NCURSES_EXPORT(void) _nc_init_keytry (SCREEN *);

View File

@ -41,7 +41,7 @@
#include <curses.priv.h>
MODULE_ID("$Id: lib_data.c,v 1.44 2008/05/24 23:09:21 tom Exp $")
MODULE_ID("$Id: lib_data.c,v 1.47 2008/05/31 19:44:36 tom Exp $")
/*
* OS/2's native linker complains if we don't initialize public data when
@ -168,8 +168,6 @@ NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals = {
NULL, /* tracedmp_buf */
0, /* tracedmp_used */
CHARS_0s, /* tracemse_buf */
NULL, /* tracetry_buf */
0, /* tracetry_used */

View File

@ -1,5 +1,5 @@
/****************************************************************************
* Copyright (c) 1998-2006,2007 Free Software Foundation, Inc. *
* Copyright (c) 1998-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 *
@ -39,7 +39,7 @@
#include <curses.priv.h>
#include <term.h> /* acs_chars */
MODULE_ID("$Id: lib_traceatr.c,v 1.59 2007/06/09 17:22:10 tom Exp $")
MODULE_ID("$Id: lib_traceatr.c,v 1.60 2008/05/31 16:53:15 tom Exp $")
#define COLOR_OF(c) ((c < 0) ? "default" : (c > 7 ? color_of(c) : colors[c].name))
@ -255,7 +255,7 @@ _tracechtype2(int bufnum, chtype ch)
if ((found = _nc_altcharset_name(ChAttrOf(ch), ch)) != 0) {
(void) _nc_trace_bufcat(bufnum, found);
} else
(void) _nc_trace_bufcat(bufnum, _tracechar((int)ChCharOf(ch)));
(void) _nc_trace_bufcat(bufnum, _nc_tracechar(SP, (int)ChCharOf(ch)));
if (ChAttrOf(ch) != A_NORMAL) {
(void) _nc_trace_bufcat(bufnum, " | ");
@ -311,14 +311,14 @@ _tracecchar_t2 (int bufnum, const cchar_t *ch)
if (PUTC_n <= 0) {
if (PUTC_ch != L'\0') {
/* it could not be a multibyte sequence */
(void) _nc_trace_bufcat(bufnum, _tracechar(UChar(ch->chars[PUTC_i])));
(void) _nc_trace_bufcat(bufnum, _nc_tracechar(SP, UChar(ch->chars[PUTC_i])));
}
break;
}
for (n = 0; n < PUTC_n; n++) {
if (n)
(void) _nc_trace_bufcat(bufnum, ", ");
(void) _nc_trace_bufcat(bufnum, _tracechar(UChar(PUTC_buf[n])));
(void) _nc_trace_bufcat(bufnum, _nc_tracechar(SP, UChar(PUTC_buf[n])));
}
}
(void) _nc_trace_bufcat(bufnum, " }");

View File

@ -39,18 +39,20 @@
#include <ctype.h>
MODULE_ID("$Id: lib_tracechr.c,v 1.13 2007/04/21 23:16:37 tom Exp $")
MODULE_ID("$Id: lib_tracechr.c,v 1.17 2008/05/31 19:57:47 tom Exp $")
#ifdef TRACE
#define MyBuffer _nc_globals.tracechr_buf
NCURSES_EXPORT(char *)
_tracechar(int ch)
_nc_tracechar(SCREEN *sp, int ch)
{
NCURSES_CONST char *name;
char *MyBuffer = ((sp != 0)
? sp->tracechr_buf
: _nc_globals.tracechr_buf);
if (ch > KEY_MIN || ch < 0) {
name = keyname(ch);
name = _nc_keyname(sp, ch);
if (name == 0 || *name == '\0')
name = "NULL";
(void) sprintf(MyBuffer, "'%.30s' = %#03o", name, ch);
@ -62,13 +64,19 @@ _tracechar(int ch)
*/
(void) sprintf(MyBuffer, "%#03o", ch);
} else {
name = unctrl((chtype) ch);
name = _nc_unctrl(sp, (chtype) ch);
if (name == 0 || *name == 0)
name = "null"; /* shouldn't happen */
(void) sprintf(MyBuffer, "'%.30s' = %#03o", name, ch);
}
return (MyBuffer);
}
NCURSES_EXPORT(char *)
_tracechar(int ch)
{
return _nc_tracechar(SP, ch);
}
#else
empty_module(_nc_lib_tracechr)
#endif

View File

@ -1,5 +1,5 @@
/****************************************************************************
* Copyright (c) 1998-2005,2007 Free Software Foundation, Inc. *
* Copyright (c) 1998-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 *
@ -38,14 +38,14 @@
#include <curses.priv.h>
MODULE_ID("$Id: lib_tracemse.c,v 1.13 2007/04/21 21:23:00 tom Exp $")
MODULE_ID("$Id: lib_tracemse.c,v 1.14 2008/05/31 17:20:25 tom Exp $")
#ifdef TRACE
#define my_buffer _nc_globals.tracemse_buf
#define my_buffer sp->tracemse_buf
NCURSES_EXPORT(char *)
_tracemouse(MEVENT const *ep)
_nc_tracemouse(SCREEN *sp, MEVENT const *ep)
{
(void) sprintf(my_buffer, TRACEMSE_FMT,
ep->id,
@ -114,6 +114,12 @@ _tracemouse(MEVENT const *ep)
return (my_buffer);
}
NCURSES_EXPORT(char *)
_tracemouse(MEVENT const *ep)
{
return _nc_tracemouse(SP, ep);
}
#else /* !TRACE */
empty_module(_nc_lib_tracemouse)
#endif