X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Fbase%2Flib_mouse.c;h=e92be5b92fe0f8a716bf8876070aa6b4f1845284;hp=0151eb39873928f324e594ed0f1049bd6a048f29;hb=1c2ec25b8186b7973aeb06ec4da6b63656e12f7d;hpb=bd7ef7c2309fd00aa4576168c46f557c622cb9c3 diff --git a/ncurses/base/lib_mouse.c b/ncurses/base/lib_mouse.c index 0151eb39..e92be5b9 100644 --- a/ncurses/base/lib_mouse.c +++ b/ncurses/base/lib_mouse.c @@ -79,7 +79,7 @@ #include -MODULE_ID("$Id: lib_mouse.c,v 1.94 2008/05/31 20:30:10 tom Exp $") +MODULE_ID("$Id: lib_mouse.c,v 1.98 2008/09/20 21:26:19 tom Exp $") #include #include @@ -150,7 +150,7 @@ make an error #define LIBGPM_SONAME "libgpm.so" #endif -#define GET_DLSYM(name) (my_##name = (TYPE_##name) dlsym(obj, #name)) +#define GET_DLSYM(name) (my_##name = (TYPE_##name) dlsym(SP->_dlopen_gpm, #name)) #endif /* USE_GPM_SUPPORT */ @@ -160,16 +160,25 @@ static void _nc_mouse_wrap(SCREEN *); /* maintain a circular list of mouse events */ +#define FirstEV(sp) ((sp)->_mouse_events) +#define LastEV(sp) ((sp)->_mouse_events + EV_MAX - 1) + #undef NEXT -#define NEXT(ep) ((ep == sp->_mouse_events + EV_MAX - 1) \ - ? sp->_mouse_events \ +#define NEXT(ep) ((ep >= LastEV(sp)) \ + ? FirstEV(sp) \ : ep + 1) #undef PREV -#define PREV(ep) ((ep == sp->_mouse_events) \ - ? sp->_mouse_events + EV_MAX - 1 \ +#define PREV(ep) ((ep <= FirstEV(sp)) \ + ? LastEV(sp) \ : ep - 1) +#define IndexEV(sp, ep) (ep - FirstEV(sp)) + +#define RunParams(sp, eventp, runp) \ + (long) IndexEV(sp, runp), \ + (long) (IndexEV(sp, eventp) + (EV_MAX - 1)) % EV_MAX + #ifdef TRACE static void _trace_slot(SCREEN *sp, const char *tag) @@ -178,9 +187,9 @@ _trace_slot(SCREEN *sp, const char *tag) _tracef(tag); - for (ep = sp->_mouse_events; ep < sp->_mouse_events + EV_MAX; ep++) + for (ep = FirstEV(sp); ep <= LastEV(sp); ep++) _tracef("mouse event queue slot %ld = %s", - (long) (ep - sp->_mouse_events), + (long) IndexEV(sp, ep), _nc_tracemouse(sp, ep)); } #endif @@ -383,7 +392,7 @@ enable_gpm_mouse(SCREEN *sp, int enable) /* 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); + (unsigned short) (~(sp->_mouse_gpm_connect.eventMask | GPM_HARD)); sp->_mouse_gpm_connect.minMod = 0; sp->_mouse_gpm_connect.maxMod = (unsigned short) (~((1 << KG_SHIFT) | @@ -406,6 +415,15 @@ enable_gpm_mouse(SCREEN *sp, int enable) } result = FALSE; } +#ifdef HAVE_LIBDL + if (!result && (SP->_dlopen_gpm != 0)) { + T(("unload GPM library")); + SP->_mouse_gpm_found = FALSE; + SP->_mouse_gpm_loaded = FALSE; + dlclose(SP->_dlopen_gpm); + SP->_dlopen_gpm = 0; + } +#endif returnBool(result); } #endif /* USE_GPM_SUPPORT */ @@ -422,15 +440,13 @@ initialize_mousetype(SCREEN *sp) if (allow_gpm_mouse()) { if (!sp->_mouse_gpm_loaded) { #ifdef HAVE_LIBDL - void *obj; - - if ((obj = dlopen(LIBGPM_SONAME, my_RTLD)) != 0) { + 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())); - dlclose(obj); + dlclose(SP->_dlopen_gpm); } else { sp->_mouse_gpm_found = TRUE; } @@ -591,7 +607,7 @@ _nc_mouse_init(SCREEN *sp) TR(MY_TRACE, ("_nc_mouse_init() called")); - sp->_mouse_eventp = sp->_mouse_events; + sp->_mouse_eventp = FirstEV(sp); for (i = 0; i < EV_MAX; i++) sp->_mouse_events[i].id = INVALID_EVENT; @@ -758,7 +774,7 @@ _nc_mouse_inline(SCREEN *sp) * Wheel mice may return buttons 4 and 5 when the wheel is turned. * We encode those as button presses. */ - for (grabbed = 0; grabbed < 3; grabbed += res) { + 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 @@ -788,9 +804,9 @@ _nc_mouse_inline(SCREEN *sp) eventp->bstate = MASK_RELEASE(n) #else #define PRESS_POSITION(n) \ - eventp->bstate = (prev & MASK_PRESS(n) \ - ? REPORT_MOUSE_POSITION \ - : MASK_PRESS(n)) + eventp->bstate = (mmask_t) (prev & MASK_PRESS(n) \ + ? REPORT_MOUSE_POSITION \ + : MASK_PRESS(n)) #endif switch (kbuf[0] & 0x3) { @@ -855,7 +871,7 @@ _nc_mouse_inline(SCREEN *sp) TR(MY_TRACE, ("_nc_mouse_inline: primitive mouse-event %s has slot %ld", _nc_tracemouse(sp, eventp), - (long) (eventp - sp->_mouse_events))); + (long) IndexEV(sp, eventp))); /* bump the next-free pointer into the circular list */ sp->_mouse_eventp = NEXT(eventp); @@ -979,7 +995,7 @@ _nc_mouse_parse(SCREEN *sp, int runcount) TR(MY_TRACE, ("_nc_mouse_parse: returning simple mouse event %s at slot %ld", _nc_tracemouse(sp, prev), - (long) (prev - sp->_mouse_events))); + (long) IndexEV(sp, prev))); return (prev->id >= NORMAL_EVENT) ? ((prev->bstate & sp->_mouse_mask) ? TRUE : FALSE) : FALSE; @@ -995,8 +1011,7 @@ _nc_mouse_parse(SCREEN *sp, int runcount) if (USE_TRACEF(TRACE_IEVENT)) { _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, + RunParams(sp, eventp, runp), runcount); _nc_unlock_global(tracef); } @@ -1039,8 +1054,7 @@ _nc_mouse_parse(SCREEN *sp, int runcount) if (USE_TRACEF(TRACE_IEVENT)) { _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, + RunParams(sp, eventp, runp), runcount); _nc_unlock_global(tracef); } @@ -1111,8 +1125,7 @@ _nc_mouse_parse(SCREEN *sp, int runcount) if (USE_TRACEF(TRACE_IEVENT)) { _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, + RunParams(sp, eventp, runp), runcount); _nc_unlock_global(tracef); } @@ -1130,8 +1143,7 @@ _nc_mouse_parse(SCREEN *sp, int runcount) if (USE_TRACEF(TRACE_IEVENT)) { _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, + RunParams(sp, eventp, runp), runcount); _nc_unlock_global(tracef); } @@ -1140,7 +1152,7 @@ _nc_mouse_parse(SCREEN *sp, int runcount) TR(MY_TRACE, ("_nc_mouse_parse: returning composite mouse event %s at slot %ld", _nc_tracemouse(sp, ep), - (long) (ep - sp->_mouse_events))); + (long) IndexEV(sp, ep))); #endif /* TRACE */ /* after all this, do we have a valid event? */ @@ -1227,7 +1239,7 @@ _nc_getmouse(SCREEN *sp, MEVENT * aevent) TR(TRACE_IEVENT, ("getmouse: returning event %s from slot %ld", _nc_tracemouse(sp, prev), - (long) (prev - sp->_mouse_events))); + (long) IndexEV(sp, prev))); prev->id = INVALID_EVENT; /* so the queue slot becomes free */ returnCode(OK); @@ -1302,9 +1314,6 @@ mousemask(mmask_t newmask, mmask_t * oldmask) SP->_mouse_mask = result; } } - } else { - if (oldmask) - *oldmask = SP->_mouse_mask; } returnBits(result); }