/* used in devWindows.c and cairoDevice */ void doKeybd(pDevDesc dd, R_KeyName rkey, const char *keyname) { SEXP handler, skey, temp, result; dd->gettingEvent = FALSE; /* avoid recursive calls */ handler = findVar(install(keybdHandler), dd->eventEnv); if (TYPEOF(handler) == PROMSXP) handler = eval(handler, dd->eventEnv); if (TYPEOF(handler) == CLOSXP) { defineVar(install("which"), ScalarInteger(ndevNumber(dd)+1), dd->eventEnv); PROTECT(skey = mkString(keyname ? keyname : keynames[rkey])); PROTECT(temp = lang2(handler, skey)); PROTECT(result = eval(temp, dd->eventEnv)); defineVar(install("result"), result, dd->eventEnv); UNPROTECT(3); R_FlushConsole(); } dd->gettingEvent = TRUE; return; }
/* used in devWindows.c and cairoDevice */ void doMouseEvent(pDevDesc dd, R_MouseEvent event, int buttons, double x, double y) { int i; SEXP handler, bvec, sx, sy, temp, result; dd->gettingEvent = FALSE; /* avoid recursive calls */ handler = findVar(install(mouseHandlers[event]), dd->eventEnv); if (TYPEOF(handler) == PROMSXP) handler = eval(handler, dd->eventEnv); 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); PROTECT(bvec = allocVector(INTSXP, len)); i = 0; if (buttons & leftButton) INTEGER(bvec)[i++] = 0; if (buttons & middleButton) INTEGER(bvec)[i++] = 1; if (buttons & rightButton) INTEGER(bvec)[i++] = 2; PROTECT(sx = ScalarReal( (x - dd->left) / (dd->right - dd->left) )); PROTECT(sy = ScalarReal((y - dd->bottom) / (dd->top - dd->bottom) )); PROTECT(temp = lang4(handler, bvec, sx, sy)); PROTECT(result = eval(temp, dd->eventEnv)); defineVar(install("result"), result, dd->eventEnv); UNPROTECT(5); R_FlushConsole(); } dd->gettingEvent = TRUE; return; }