ncurses 5.6 - patch 20080925

+ fix bug in mouse code for GPM from 20080920 changes (reported in
  Debian #500103, also Miroslav Lichvar).
This commit is contained in:
Thomas E. Dickey 2008-09-25 23:54:34 +00:00
parent 1c2ec25b81
commit feb958a7e8
3 changed files with 71 additions and 41 deletions

6
NEWS
View File

@ -25,7 +25,7 @@
-- sale, use or other dealings in this Software without prior written -- -- sale, use or other dealings in this Software without prior written --
-- authorization. -- -- authorization. --
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
-- $Id: NEWS,v 1.1296 2008/09/20 21:45:57 tom Exp $ -- $Id: NEWS,v 1.1297 2008/09/25 23:30:56 tom Exp $
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
This is a log of changes that ncurses has gone through since Zeyd started This is a log of changes that ncurses has gone through since Zeyd started
@ -45,6 +45,10 @@ See the AUTHORS file for the corresponding full names.
Changes through 1.9.9e did not credit all contributions; Changes through 1.9.9e did not credit all contributions;
it is not possible to add this information. it is not possible to add this information.
20080925
+ fix bug in mouse code for GPM from 20080920 changes (reported in
Debian #500103, also Miroslav Lichvar).
20080920 20080920
+ fix shared-library rules for cygwin with tic- and tinfo-libraries. + fix shared-library rules for cygwin with tic- and tinfo-libraries.
+ fix a memory leak when failure to connect to GPM. + fix a memory leak when failure to connect to GPM.

View File

@ -25,7 +25,7 @@
# use or other dealings in this Software without prior written # # use or other dealings in this Software without prior written #
# authorization. # # authorization. #
############################################################################## ##############################################################################
# $Id: dist.mk,v 1.661 2008/09/20 16:52:23 tom Exp $ # $Id: dist.mk,v 1.662 2008/09/25 20:12:43 tom Exp $
# Makefile for creating ncurses distributions. # Makefile for creating ncurses distributions.
# #
# This only needs to be used directly as a makefile by developers, but # 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. # These define the major/minor/patch versions of ncurses.
NCURSES_MAJOR = 5 NCURSES_MAJOR = 5
NCURSES_MINOR = 6 NCURSES_MINOR = 6
NCURSES_PATCH = 20080920 NCURSES_PATCH = 20080925
# We don't append the patch to the version, since this only applies to releases # We don't append the patch to the version, since this only applies to releases
VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR) VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR)

View File

@ -79,7 +79,7 @@
#include <curses.priv.h> #include <curses.priv.h>
MODULE_ID("$Id: lib_mouse.c,v 1.98 2008/09/20 21:26:19 tom Exp $") MODULE_ID("$Id: lib_mouse.c,v 1.99 2008/09/25 21:47:51 tom Exp $")
#include <term.h> #include <term.h>
#include <tic.h> #include <tic.h>
@ -381,29 +381,69 @@ allow_gpm_mouse(void)
return FALSE; return FALSE;
} }
#ifdef HAVE_LIBDL
static void
unload_gpm_library(SCREEN *sp)
{
if (SP->_dlopen_gpm != 0) {
T(("unload GPM library"));
sp->_mouse_gpm_loaded = FALSE;
dlclose(sp->_dlopen_gpm);
sp->_dlopen_gpm = 0;
}
}
static void
load_gpm_library(SCREEN *sp)
{
sp->_mouse_gpm_found = FALSE;
if ((sp->_dlopen_gpm = dlopen(LIBGPM_SONAME, my_RTLD)) != 0) {
if (GET_DLSYM(gpm_fd) == 0 ||
GET_DLSYM(Gpm_Open) == 0 ||
GET_DLSYM(Gpm_Close) == 0 ||
GET_DLSYM(Gpm_GetEvent) == 0) {
T(("GPM initialization failed: %s", dlerror()));
unload_gpm_library(sp);
} else {
sp->_mouse_gpm_found = TRUE;
sp->_mouse_gpm_loaded = TRUE;
}
}
}
#endif
static bool static bool
enable_gpm_mouse(SCREEN *sp, int enable) enable_gpm_mouse(SCREEN *sp, bool enable)
{ {
bool result; bool result;
T((T_CALLED("enable_gpm_mouse(%d)"), enable)); T((T_CALLED("enable_gpm_mouse(%d)"), enable));
if (enable && !sp->_mouse_active) { if (enable && !sp->_mouse_active) {
/* GPM: initialize connection to gpm server */ #ifdef HAVE_LIBDL
sp->_mouse_gpm_connect.eventMask = GPM_DOWN | GPM_UP; if (sp->_mouse_gpm_found && !sp->_mouse_gpm_loaded) {
sp->_mouse_gpm_connect.defaultMask = load_gpm_library(sp);
(unsigned short) (~(sp->_mouse_gpm_connect.eventMask | GPM_HARD)); }
sp->_mouse_gpm_connect.minMod = 0; #endif
sp->_mouse_gpm_connect.maxMod = if (sp->_mouse_gpm_loaded) {
(unsigned short) (~((1 << KG_SHIFT) | /* GPM: initialize connection to gpm server */
(1 << KG_SHIFTL) | sp->_mouse_gpm_connect.eventMask = GPM_DOWN | GPM_UP;
(1 << KG_SHIFTR))); sp->_mouse_gpm_connect.defaultMask =
/* (unsigned short) (~(sp->_mouse_gpm_connect.eventMask | GPM_HARD));
* Note: GPM hardcodes \E[?1001s and \E[?1000h during its open. sp->_mouse_gpm_connect.minMod = 0;
* The former is recognized by wscons (SunOS), and the latter by sp->_mouse_gpm_connect.maxMod =
* xterm. Those will not show up in ncurses' traces. (unsigned short) (~((1 << KG_SHIFT) |
*/ (1 << KG_SHIFTL) |
result = (my_Gpm_Open(&sp->_mouse_gpm_connect, 0) >= 0); (1 << KG_SHIFTR)));
/*
* Note: GPM hardcodes \E[?1001s and \E[?1000h during its open.
* 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);
} else {
result = FALSE;
}
sp->_mouse_active = result; sp->_mouse_active = result;
T(("GPM open %s", result ? "succeeded" : "failed")); T(("GPM open %s", result ? "succeeded" : "failed"));
} else { } else {
@ -413,15 +453,11 @@ enable_gpm_mouse(SCREEN *sp, int enable)
sp->_mouse_active = FALSE; sp->_mouse_active = FALSE;
T(("GPM closed")); T(("GPM closed"));
} }
result = FALSE; result = enable;
} }
#ifdef HAVE_LIBDL #ifdef HAVE_LIBDL
if (!result && (SP->_dlopen_gpm != 0)) { if (!result) {
T(("unload GPM library")); unload_gpm_library(sp);
SP->_mouse_gpm_found = FALSE;
SP->_mouse_gpm_loaded = FALSE;
dlclose(SP->_dlopen_gpm);
SP->_dlopen_gpm = 0;
} }
#endif #endif
returnBool(result); returnBool(result);
@ -440,21 +476,11 @@ initialize_mousetype(SCREEN *sp)
if (allow_gpm_mouse()) { if (allow_gpm_mouse()) {
if (!sp->_mouse_gpm_loaded) { if (!sp->_mouse_gpm_loaded) {
#ifdef HAVE_LIBDL #ifdef HAVE_LIBDL
if ((SP->_dlopen_gpm = dlopen(LIBGPM_SONAME, my_RTLD)) != 0) { load_gpm_library(sp);
if (GET_DLSYM(gpm_fd) == 0 ||
GET_DLSYM(Gpm_Open) == 0 ||
GET_DLSYM(Gpm_Close) == 0 ||
GET_DLSYM(Gpm_GetEvent) == 0) {
T(("GPM initialization failed: %s", dlerror()));
dlclose(SP->_dlopen_gpm);
} else {
sp->_mouse_gpm_found = TRUE;
}
}
#else /* !HAVE_LIBDL */ #else /* !HAVE_LIBDL */
sp->_mouse_gpm_found = TRUE; sp->_mouse_gpm_found = TRUE;
#endif
sp->_mouse_gpm_loaded = TRUE; sp->_mouse_gpm_loaded = TRUE;
#endif
} }
/* /*
@ -904,7 +930,7 @@ mouse_activate(SCREEN *sp, bool on)
break; break;
#if USE_GPM_SUPPORT #if USE_GPM_SUPPORT
case M_GPM: case M_GPM:
if (enable_gpm_mouse(sp, 1)) { if (enable_gpm_mouse(sp, TRUE)) {
sp->_mouse_fd = *(my_gpm_fd); sp->_mouse_fd = *(my_gpm_fd);
T(("GPM mouse_fd %d", sp->_mouse_fd)); T(("GPM mouse_fd %d", sp->_mouse_fd));
} }
@ -936,7 +962,7 @@ mouse_activate(SCREEN *sp, bool on)
break; break;
#if USE_GPM_SUPPORT #if USE_GPM_SUPPORT
case M_GPM: case M_GPM:
enable_gpm_mouse(sp, 0); enable_gpm_mouse(sp, FALSE);
break; break;
#endif #endif
#if USE_SYSMOUSE #if USE_SYSMOUSE