From c4385a0013bcc08cc949de41f4a5964520956c8e Mon Sep 17 00:00:00 2001 From: Navarum <48705414+navarum@users.noreply.github.com> Date: Mon, 30 Dec 2019 05:15:17 -0800 Subject: [PATCH 1/4] Add support for multiple mouse buttons --- src/include/R_ext/GraphicsDevice.h | 1 + src/main/gevents.c | 31 ++++++++++++++++++++++-------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/include/R_ext/GraphicsDevice.h b/src/include/R_ext/GraphicsDevice.h index d2604daf98..dbc0e2ad17 100644 --- a/src/include/R_ext/GraphicsDevice.h +++ b/src/include/R_ext/GraphicsDevice.h @@ -819,6 +819,7 @@ typedef enum {meMouseDown = 0, meMouseUp, meMouseMove} R_MouseEvent; +#define mouseButtonMax 24 #define leftButton 1 #define middleButton 2 #define rightButton 4 diff --git a/src/main/gevents.c b/src/main/gevents.c index 8781e8ef17..1653e86697 100644 --- a/src/main/gevents.c +++ b/src/main/gevents.c @@ -208,11 +208,12 @@ do_getGraphicsEvent(SEXP call, SEXP op, SEXP args, SEXP env) return(result); } + /* used in devWindows.c and cairoDevice */ void doMouseEvent(pDevDesc dd, R_MouseEvent event, int buttons, double x, double y) { - int i; + int i, j; SEXP handler, bvec, sx, sy, temp, result; dd->gettingEvent = FALSE; /* avoid recursive calls */ @@ -226,16 +227,30 @@ void doMouseEvent(pDevDesc dd, R_MouseEvent event, if (TYPEOF(handler) == CLOSXP) { SEXP s_which = install("which"); defineVar(s_which, ScalarInteger(ndevNumber(dd)+1), dd->eventEnv); - // Be portable: see PR#15793 - int len = ((buttons & leftButton) != 0) - + ((buttons & middleButton) != 0) - + ((buttons & rightButton) != 0); + int len; + if(1) { + /* RButtons = 1 << (event.xbutton.button - 1); */ + len = 0; + for(j=0; jleft) / (dd->right - dd->left) )); PROTECT(sy = ScalarReal((y - dd->bottom) / (dd->top - dd->bottom) )); -- 2.32.0