#include <curses.priv.h>
-MODULE_ID("$Id: lib_mouse.c,v 1.99 2008/09/25 21:47:51 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>
* 3 = middle.
*/
if ((mouev.fs ^ oldstate) & MOUSE_BN1_DOWN)
- write_event(mouev.fs & MOUSE_BN1_DOWN,
+ write_event(sp, mouev.fs & MOUSE_BN1_DOWN,
sp->_emxmouse_buttons[1], mouev.col, mouev.row);
if ((mouev.fs ^ oldstate) & MOUSE_BN2_DOWN)
- write_event(mouev.fs & MOUSE_BN2_DOWN,
+ write_event(sp, mouev.fs & MOUSE_BN2_DOWN,
sp->_emxmouse_buttons[3], mouev.col, mouev.row);
if ((mouev.fs ^ oldstate) & MOUSE_BN3_DOWN)
- write_event(mouev.fs & MOUSE_BN3_DOWN,
+ write_event(sp, mouev.fs & MOUSE_BN3_DOWN,
sp->_emxmouse_buttons[2], mouev.col, mouev.row);
finish:
}
#if USE_GPM_SUPPORT
-static int
+static bool
allow_gpm_mouse(void)
{
+ bool result = FALSE;
+
/* GPM does printf's without checking if stdout is a terminal */
if (isatty(fileno(stdout))) {
+ char *list = getenv("NCURSES_GPM_TERMS");
char *env = getenv("TERM");
- /* GPM checks the beginning of the $TERM variable to decide if
- * it should pass xterm events through. There is no real advantage
- * in allowing GPM to do this.
- */
- if (env == 0 || strncmp(env, "xterm", 5))
- return TRUE;
+ if (list != 0) {
+ if (env != 0) {
+ result = _nc_name_match(list, env, "|:");
+ }
+ } else {
+ /* GPM checks the beginning of the $TERM variable to decide if it
+ * should pass xterm events through. There is no real advantage in
+ * allowing GPM to do this. Recent versions relax that check, and
+ * pretend that GPM can work with any terminal having the kmous
+ * capability. Perhaps that works for someone. If so, they can
+ * set the environment variable (above).
+ */
+ if (env != 0 && strstr(env, "linux") != 0) {
+ result = TRUE;
+ }
+ }
}
- return FALSE;
+ return result;
}
#ifdef HAVE_LIBDL
if (SP->_dlopen_gpm != 0) {
T(("unload GPM library"));
sp->_mouse_gpm_loaded = FALSE;
+ sp->_mouse_fd = -1;
dlclose(sp->_dlopen_gpm);
sp->_dlopen_gpm = 0;
}
setmode(handles[1], O_BINARY);
/* Do not use CRT functions, we may single-threaded. */
rc = DosCreateThread((unsigned long *) &sp->_emxmouse_thread,
- mouse_server, sp, 0, 8192);
+ mouse_server, (long) sp, 0, 8192);
if (rc) {
printf("mouse thread error %d=%#x", rc, rc);
} else {