aboutsummaryrefslogtreecommitdiff
path: root/ncurses/base/lib_mouse.c
diff options
context:
space:
mode:
Diffstat (limited to 'ncurses/base/lib_mouse.c')
-rw-r--r--ncurses/base/lib_mouse.c277
1 files changed, 74 insertions, 203 deletions
diff --git a/ncurses/base/lib_mouse.c b/ncurses/base/lib_mouse.c
index dac039551165..95f29aa69111 100644
--- a/ncurses/base/lib_mouse.c
+++ b/ncurses/base/lib_mouse.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2010,2011 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 *
@@ -30,7 +30,6 @@
* Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
* and: Eric S. Raymond <esr@snark.thyrsus.com> *
* and: Thomas E. Dickey 1996-on *
- * and: Juergen Pfeifer 2008 *
****************************************************************************/
/*
@@ -80,12 +79,9 @@
#include <curses.priv.h>
-#ifndef CUR
-#define CUR SP_TERMTYPE
-#endif
-
-MODULE_ID("$Id: lib_mouse.c,v 1.121 2011/01/22 19:47:47 tom Exp $")
+MODULE_ID("$Id: lib_mouse.c,v 1.102 2008/10/18 21:48:55 tom Exp $")
+#include <term.h>
#include <tic.h>
#if USE_GPM_SUPPORT
@@ -122,12 +118,12 @@ make an error
#define MY_TRACE TRACE_ICALLS|TRACE_IEVENT
-#define MASK_RELEASE(x) (mmask_t) NCURSES_MOUSE_MASK(x, 001)
-#define MASK_PRESS(x) (mmask_t) NCURSES_MOUSE_MASK(x, 002)
-#define MASK_CLICK(x) (mmask_t) NCURSES_MOUSE_MASK(x, 004)
-#define MASK_DOUBLE_CLICK(x) (mmask_t) NCURSES_MOUSE_MASK(x, 010)
-#define MASK_TRIPLE_CLICK(x) (mmask_t) NCURSES_MOUSE_MASK(x, 020)
-#define MASK_RESERVED_EVENT(x) (mmask_t) NCURSES_MOUSE_MASK(x, 040)
+#define MASK_RELEASE(x) NCURSES_MOUSE_MASK(x, 001)
+#define MASK_PRESS(x) NCURSES_MOUSE_MASK(x, 002)
+#define MASK_CLICK(x) NCURSES_MOUSE_MASK(x, 004)
+#define MASK_DOUBLE_CLICK(x) NCURSES_MOUSE_MASK(x, 010)
+#define MASK_TRIPLE_CLICK(x) NCURSES_MOUSE_MASK(x, 020)
+#define MASK_RESERVED_EVENT(x) NCURSES_MOUSE_MASK(x, 040)
#if NCURSES_MOUSE_VERSION == 1
#define BUTTON_CLICKED (BUTTON1_CLICKED | BUTTON2_CLICKED | BUTTON3_CLICKED | BUTTON4_CLICKED)
@@ -154,7 +150,7 @@ make an error
#define LIBGPM_SONAME "libgpm.so"
#endif
-#define GET_DLSYM(name) (my_##name = (TYPE_##name) dlsym(sp->_dlopen_gpm, #name))
+#define GET_DLSYM(name) (my_##name = (TYPE_##name) dlsym(SP->_dlopen_gpm, #name))
#endif /* USE_GPM_SUPPORT */
@@ -168,13 +164,13 @@ static void _nc_mouse_wrap(SCREEN *);
#define LastEV(sp) ((sp)->_mouse_events + EV_MAX - 1)
#undef NEXT
-#define NEXT(ep) ((ep >= LastEV(SP_PARM)) \
- ? FirstEV(SP_PARM) \
+#define NEXT(ep) ((ep >= LastEV(sp)) \
+ ? FirstEV(sp) \
: ep + 1)
#undef PREV
-#define PREV(ep) ((ep <= FirstEV(SP_PARM)) \
- ? LastEV(SP_PARM) \
+#define PREV(ep) ((ep <= FirstEV(sp)) \
+ ? LastEV(sp) \
: ep - 1)
#define IndexEV(sp, ep) (ep - FirstEV(sp))
@@ -189,7 +185,7 @@ _trace_slot(SCREEN *sp, const char *tag)
{
MEVENT *ep;
- _tracef("%s", tag);
+ _tracef(tag);
for (ep = FirstEV(sp); ep <= LastEV(sp); ep++)
_tracef("mouse event queue slot %ld = %s",
@@ -344,13 +340,10 @@ sysmouse_server(SCREEN *sp)
static void
handle_sysmouse(int sig GCC_UNUSED)
{
- sysmouse_server(CURRENT_SCREEN);
+ sysmouse_server(SP);
}
#endif /* USE_SYSMOUSE */
-#ifndef USE_TERM_DRIVER
-#define xterm_kmous "\033[M"
-
static void
init_xterm_mouse(SCREEN *sp)
{
@@ -359,7 +352,6 @@ init_xterm_mouse(SCREEN *sp)
if (!VALID_STRING(sp->_mouse_xtermcap))
sp->_mouse_xtermcap = "\033[?1000%?%p1%{1}%=%th%el%;";
}
-#endif
static void
enable_xterm_mouse(SCREEN *sp, int enable)
@@ -367,9 +359,7 @@ enable_xterm_mouse(SCREEN *sp, int enable)
#if USE_EMX_MOUSE
sp->_emxmouse_activated = enable;
#else
- NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx
- "xterm-mouse",
- TPARM_1(sp->_mouse_xtermcap, enable));
+ putp(TPARM_1(sp->_mouse_xtermcap, enable));
#endif
sp->_mouse_active = enable;
}
@@ -408,7 +398,7 @@ allow_gpm_mouse(void)
static void
unload_gpm_library(SCREEN *sp)
{
- if (sp->_dlopen_gpm != 0) {
+ if (SP->_dlopen_gpm != 0) {
T(("unload GPM library"));
sp->_mouse_gpm_loaded = FALSE;
sp->_mouse_fd = -1;
@@ -450,8 +440,6 @@ enable_gpm_mouse(SCREEN *sp, bool enable)
}
#endif
if (sp->_mouse_gpm_loaded) {
- int code;
-
/* GPM: initialize connection to gpm server */
sp->_mouse_gpm_connect.eventMask = GPM_DOWN | GPM_UP;
sp->_mouse_gpm_connect.defaultMask =
@@ -466,16 +454,7 @@ enable_gpm_mouse(SCREEN *sp, bool enable)
* The former is recognized by wscons (SunOS), and the latter by
* xterm. Those will not show up in ncurses' traces.
*/
- code = my_Gpm_Open(&sp->_mouse_gpm_connect, 0);
- result = (code >= 0);
-
- /*
- * GPM can return a -2 if it is trying to do something with xterm.
- * Ignore that, since it conflicts with our use of stdin.
- */
- if (code == -2) {
- my_Gpm_Close();
- }
+ result = (my_Gpm_Open(&sp->_mouse_gpm_connect, 0) >= 0);
} else {
result = FALSE;
}
@@ -499,6 +478,8 @@ enable_gpm_mouse(SCREEN *sp, bool enable)
}
#endif /* USE_GPM_SUPPORT */
+#define xterm_kmous "\033[M"
+
static void
initialize_mousetype(SCREEN *sp)
{
@@ -533,7 +514,7 @@ initialize_mousetype(SCREEN *sp)
/* OS/2 VIO */
#if USE_EMX_MOUSE
if (!sp->_emxmouse_thread
- && strstr(TerminalOf(sp)->type.term_names, "xterm") == 0
+ && strstr(cur_term->type.term_names, "xterm") == 0
&& key_mouse) {
int handles[2];
@@ -640,21 +621,16 @@ initialize_mousetype(SCREEN *sp)
}
#endif /* USE_SYSMOUSE */
-#ifdef USE_TERM_DRIVER
- CallDriver(sp, initmouse);
-#else
/* we know how to recognize mouse events under "xterm" */
if (key_mouse != 0) {
if (!strcmp(key_mouse, xterm_kmous)
- || strstr(TerminalOf(sp)->type.term_names, "xterm") != 0) {
+ || strstr(cur_term->type.term_names, "xterm") != 0) {
init_xterm_mouse(sp);
}
- } else if (strstr(TerminalOf(sp)->type.term_names, "xterm") != 0) {
+ } 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(sp);
}
-#endif
-
returnVoid;
}
@@ -689,7 +665,7 @@ _nc_mouse_init(SCREEN *sp)
* fifo_push() in lib_getch.c
*/
static bool
-_nc_mouse_event(SCREEN *sp)
+_nc_mouse_event(SCREEN *sp GCC_UNUSED)
{
MEVENT *eventp = sp->_mouse_eventp;
bool result = FALSE;
@@ -718,16 +694,11 @@ _nc_mouse_event(SCREEN *sp)
#if USE_GPM_SUPPORT
case M_GPM:
- if (sp->_mouse_fd >= 0) {
+ {
/* query server for event, return TRUE if we find one */
Gpm_Event ev;
- switch (my_Gpm_GetEvent(&ev)) {
- case 0:
- /* Connection closed, drop the mouse. */
- sp->_mouse_fd = -1;
- break;
- case 1:
+ if (my_Gpm_GetEvent(&ev) == 1) {
/* there's only one mouse... */
eventp->id = NORMAL_EVENT;
@@ -758,9 +729,8 @@ _nc_mouse_event(SCREEN *sp)
eventp->z = 0;
/* bump the next-free pointer into the circular list */
- sp->_mouse_eventp = NEXT(eventp);
+ sp->_mouse_eventp = eventp = NEXT(eventp);
result = TRUE;
- break;
}
}
break;
@@ -789,28 +759,6 @@ _nc_mouse_event(SCREEN *sp)
break;
#endif /* USE_SYSMOUSE */
-#ifdef USE_TERM_DRIVER
- case M_TERM_DRIVER:
- while (sp->_drv_mouse_head < sp->_drv_mouse_tail) {
- *eventp = sp->_drv_mouse_fifo[sp->_drv_mouse_head];
-
- /*
- * Point the fifo-head to the next possible location. If there
- * are none, reset the indices.
- */
- sp->_drv_mouse_head += 1;
- if (sp->_drv_mouse_head == sp->_drv_mouse_tail) {
- sp->_drv_mouse_tail = 0;
- sp->_drv_mouse_head = 0;
- }
-
- /* bump the next-free pointer into the circular list */
- sp->_mouse_eventp = eventp = NEXT(eventp);
- result = TRUE;
- }
- break;
-#endif
-
case M_NONE:
break;
}
@@ -866,26 +814,17 @@ _nc_mouse_inline(SCREEN *sp)
* Wheel mice may return buttons 4 and 5 when the wheel is turned.
* We encode those as button presses.
*/
-# if USE_PTHREADS_EINTR
-# if USE_WEAK_SYMBOLS
- if ((pthread_self) && (pthread_kill) && (pthread_equal))
-# endif
- _nc_globals.read_thread = pthread_self();
-# endif
for (grabbed = 0; grabbed < 3; grabbed += (size_t) res) {
/* For VIO mouse we add extra bit 64 to disambiguate button-up. */
#if USE_EMX_MOUSE
- res = (int) read(M_FD(sp) >= 0 ? M_FD(sp) : sp->_ifd, &kbuf, 3);
+ res = read(M_FD(sp) >= 0 ? M_FD(sp) : sp->_ifd, &kbuf, 3);
#else
- res = (int) read(sp->_ifd, kbuf + grabbed, 3 - grabbed);
+ res = read(sp->_ifd, kbuf + grabbed, 3 - grabbed);
#endif
if (res == -1)
break;
}
-#if USE_PTHREADS_EINTR
- _nc_globals.read_thread = 0;
-#endif
kbuf[3] = '\0';
TR(TRACE_IEVENT,
@@ -998,7 +937,7 @@ mouse_activate(SCREEN *sp, bool on)
switch (sp->_mouse_type) {
case M_XTERM:
#if NCURSES_EXT_FUNCS
- NCURSES_SP_NAME(keyok) (NCURSES_SP_ARGx KEY_MOUSE, on);
+ keyok(KEY_MOUSE, on);
#endif
TPUTS_TRACE("xterm mouse initialization");
enable_xterm_mouse(sp, 1);
@@ -1017,11 +956,6 @@ mouse_activate(SCREEN *sp, bool on)
sp->_mouse_active = TRUE;
break;
#endif
-#ifdef USE_TERM_DRIVER
- case M_TERM_DRIVER:
- sp->_mouse_active = TRUE;
- break;
-#endif
case M_NONE:
return;
}
@@ -1051,16 +985,11 @@ mouse_activate(SCREEN *sp, bool on)
sp->_mouse_active = FALSE;
break;
#endif
-#ifdef USE_TERM_DRIVER
- case M_TERM_DRIVER:
- sp->_mouse_active = FALSE;
- break;
-#endif
case M_NONE:
return;
}
}
- NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
+ _nc_flush();
}
/**************************************************************************
@@ -1293,11 +1222,6 @@ _nc_mouse_wrap(SCREEN *sp)
mouse_activate(sp, FALSE);
break;
#endif
-#ifdef USE_TERM_DRIVER
- case M_TERM_DRIVER:
- mouse_activate(sp, FALSE);
- break;
-#endif
case M_NONE:
break;
}
@@ -1329,13 +1253,6 @@ _nc_mouse_resume(SCREEN *sp)
mouse_activate(sp, TRUE);
break;
#endif
-
-#ifdef USE_TERM_DRIVER
- case M_TERM_DRIVER:
- mouse_activate(sp, TRUE);
- break;
-#endif
-
case M_NONE:
break;
}
@@ -1347,92 +1264,80 @@ _nc_mouse_resume(SCREEN *sp)
*
**************************************************************************/
-NCURSES_EXPORT(int)
-NCURSES_SP_NAME(getmouse) (NCURSES_SP_DCLx MEVENT * aevent)
+static int
+_nc_getmouse(SCREEN *sp, MEVENT * aevent)
{
- int result = ERR;
+ T((T_CALLED("getmouse(%p)"), aevent));
- T((T_CALLED("getmouse(%p,%p)"), (void *) SP_PARM, (void *) aevent));
-
- if ((aevent != 0) && (SP_PARM != 0) && (SP_PARM->_mouse_type != M_NONE)) {
- MEVENT *eventp = SP_PARM->_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);
- if (prev->id != INVALID_EVENT) {
- /* copy the event we find there */
- *aevent = *prev;
+ /* copy the event we find there */
+ *aevent = *prev;
- TR(TRACE_IEVENT, ("getmouse: returning event %s from slot %ld",
- _nc_tracemouse(SP_PARM, prev),
- (long) IndexEV(SP_PARM, prev)));
+ TR(TRACE_IEVENT, ("getmouse: returning event %s from slot %ld",
+ _nc_tracemouse(sp, prev),
+ (long) IndexEV(sp, prev)));
- prev->id = INVALID_EVENT; /* so the queue slot becomes free */
- SP_PARM->_mouse_eventp = PREV(prev);
- result = OK;
- }
+ prev->id = INVALID_EVENT; /* so the queue slot becomes free */
+ returnCode(OK);
}
- returnCode(result);
+ returnCode(ERR);
}
-#if NCURSES_SP_FUNCS
/* grab a copy of the current mouse event */
NCURSES_EXPORT(int)
getmouse(MEVENT * aevent)
{
- return NCURSES_SP_NAME(getmouse) (CURRENT_SCREEN, aevent);
+ return _nc_getmouse(SP, aevent);
}
-#endif
-NCURSES_EXPORT(int)
-NCURSES_SP_NAME(ungetmouse) (NCURSES_SP_DCLx MEVENT * aevent)
+static int
+_nc_ungetmouse(SCREEN *sp, MEVENT * aevent)
{
int result = ERR;
- T((T_CALLED("ungetmouse(%p,%p)"), (void *) SP_PARM, (void *) aevent));
+ T((T_CALLED("ungetmouse(%p)"), aevent));
- if (aevent != 0 && SP_PARM != 0) {
- MEVENT *eventp = SP_PARM->_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_PARM->_mouse_eventp = NEXT(eventp);
+ sp->_mouse_eventp = NEXT(eventp);
/* push back the notification event on the keyboard queue */
- result = NCURSES_SP_NAME(ungetch) (NCURSES_SP_ARGx KEY_MOUSE);
+ result = _nc_ungetch(sp, KEY_MOUSE);
}
returnCode(result);
}
-#if NCURSES_SP_FUNCS
/* enqueue a synthesized mouse event to be seen by the next wgetch() */
NCURSES_EXPORT(int)
ungetmouse(MEVENT * aevent)
{
- return NCURSES_SP_NAME(ungetmouse) (CURRENT_SCREEN, aevent);
+ return _nc_ungetmouse(SP, aevent);
}
-#endif
NCURSES_EXPORT(mmask_t)
-NCURSES_SP_NAME(mousemask) (NCURSES_SP_DCLx mmask_t newmask, mmask_t * oldmask)
+mousemask(mmask_t newmask, mmask_t * oldmask)
/* set the mouse event mask */
{
mmask_t result = 0;
- T((T_CALLED("mousemask(%p,%#lx,%p)"),
- (void *) SP_PARM,
- (unsigned long) newmask,
- (void *) oldmask));
+ T((T_CALLED("mousemask(%#lx,%p)"), (unsigned long) newmask, oldmask));
- if (SP_PARM != 0) {
+ if (SP != 0) {
if (oldmask)
- *oldmask = SP_PARM->_mouse_mask;
+ *oldmask = SP->_mouse_mask;
- if (newmask || SP_PARM->_mouse_initialized) {
- _nc_mouse_init(SP_PARM);
- if (SP_PARM->_mouse_type != M_NONE) {
+ if (newmask || SP->_mouse_initialized) {
+ _nc_mouse_init(SP);
+ if (SP->_mouse_type != M_NONE) {
result = newmask &
(REPORT_MOUSE_POSITION
| BUTTON_ALT
@@ -1444,22 +1349,14 @@ NCURSES_SP_NAME(mousemask) (NCURSES_SP_DCLx mmask_t newmask, mmask_t * oldmask)
| BUTTON_DOUBLE_CLICKED
| BUTTON_TRIPLE_CLICKED);
- mouse_activate(SP_PARM, (bool) (result != 0));
+ mouse_activate(SP, (bool) (result != 0));
- SP_PARM->_mouse_mask = result;
+ SP->_mouse_mask = result;
}
}
}
- returnMMask(result);
-}
-
-#if NCURSES_SP_FUNCS
-NCURSES_EXPORT(mmask_t)
-mousemask(mmask_t newmask, mmask_t * oldmask)
-{
- return NCURSES_SP_NAME(mousemask) (CURRENT_SCREEN, newmask, oldmask);
+ returnBits(result);
}
-#endif
NCURSES_EXPORT(bool)
wenclose(const WINDOW *win, int y, int x)
@@ -1467,7 +1364,7 @@ wenclose(const WINDOW *win, int y, int x)
{
bool result = FALSE;
- T((T_CALLED("wenclose(%p,%d,%d)"), (const void *) win, y, x));
+ T((T_CALLED("wenclose(%p,%d,%d)"), win, y, x));
if (win != 0) {
y -= win->_yoffset;
@@ -1480,17 +1377,17 @@ wenclose(const WINDOW *win, int y, int x)
}
NCURSES_EXPORT(int)
-NCURSES_SP_NAME(mouseinterval) (NCURSES_SP_DCLx int maxclick)
+mouseinterval(int maxclick)
/* set the maximum mouse interval within which to recognize a click */
{
int oldval;
- T((T_CALLED("mouseinterval(%p,%d)"), (void *) SP_PARM, maxclick));
+ T((T_CALLED("mouseinterval(%d)"), maxclick));
- if (SP_PARM != 0) {
- oldval = SP_PARM->_maxclick;
+ if (SP != 0) {
+ oldval = SP->_maxclick;
if (maxclick >= 0)
- SP_PARM->_maxclick = maxclick;
+ SP->_maxclick = maxclick;
} else {
oldval = DEFAULT_MAXCLICK;
}
@@ -1498,46 +1395,20 @@ NCURSES_SP_NAME(mouseinterval) (NCURSES_SP_DCLx int maxclick)
returnCode(oldval);
}
-#if NCURSES_SP_FUNCS
-NCURSES_EXPORT(int)
-mouseinterval(int maxclick)
-{
- return NCURSES_SP_NAME(mouseinterval) (CURRENT_SCREEN, maxclick);
-}
-#endif
-
/* This may be used by other routines to ask for the existence of mouse
support */
-NCURSES_EXPORT(bool)
-_nc_has_mouse(SCREEN *sp)
-{
- return (((0 == sp) || (sp->_mouse_type == M_NONE)) ? FALSE : TRUE);
-}
-
-NCURSES_EXPORT(bool)
-NCURSES_SP_NAME(has_mouse) (NCURSES_SP_DCL0)
-{
- return _nc_has_mouse(SP_PARM);
-}
-
-#if NCURSES_SP_FUNCS
-NCURSES_EXPORT(bool)
-has_mouse(void)
+NCURSES_EXPORT(int)
+_nc_has_mouse(void)
{
- return _nc_has_mouse(CURRENT_SCREEN);
+ return (SP->_mouse_type == M_NONE ? 0 : 1);
}
-#endif
NCURSES_EXPORT(bool)
wmouse_trafo(const WINDOW *win, int *pY, int *pX, bool to_screen)
{
bool result = FALSE;
- T((T_CALLED("wmouse_trafo(%p,%p,%p,%d)"),
- (const void *) win,
- (void *) pY,
- (void *) pX,
- to_screen));
+ T((T_CALLED("wmouse_trafo(%p,%p,%p,%d)"), win, pY, pX, to_screen));
if (win && pY && pX) {
int y = *pY;