The R Project SVN R

Rev

Rev 86821 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 86821 Rev 87894
Line 104... Line 104...
104
    gdd = GEgetDevice(devnum);
104
    gdd = GEgetDevice(devnum);
105
    if(!gdd) errorcall(call, _("invalid device"));
105
    if(!gdd) errorcall(call, _("invalid device"));
106
    return gdd->dev->eventEnv;
106
    return gdd->dev->eventEnv;
107
}
107
}
108
 
108
 
109
/* helper function to check if there is at least one open graphics device listening for events. Returns TRUE if so, FALSE if no listening devices are found */
109
/* helper function to check if there is at least one open graphics device listening for events. Returns true if so, false if no listening devices are found */
110
 
110
 
111
static Rboolean haveListeningDev(void)
111
static bool haveListeningDev(void)
112
{
112
{
113
    Rboolean ret = FALSE;
113
    bool ret = false;
114
    pDevDesc dd;
114
    pDevDesc dd;
115
    pGEDevDesc gd;
115
    pGEDevDesc gd;
116
    if(!NoDevices())
116
    if(!NoDevices())
117
    {
117
    {
118
	for(int i = 1; i < NumDevices(); i++)
118
	for(int i = 1; i < NumDevices(); i++)
119
	{
119
	{
120
	    if ((gd = GEgetDevice(i)) && (dd = gd->dev)
120
	    if ((gd = GEgetDevice(i)) && (dd = gd->dev)
121
		 && dd->gettingEvent){
121
		 && dd->gettingEvent){
122
		ret = TRUE;
122
		ret = true;
123
		break;
123
		break;
124
	    }
124
	    }
125
	}
125
	}
126
    }
126
    }
127
    return ret;
127
    return ret;
Line 151... Line 151...
151
	    if ((gd = GEgetDevice(devNum)) && (dd = gd->dev)) {
151
	    if ((gd = GEgetDevice(devNum)) && (dd = gd->dev)) {
152
		if (dd->gettingEvent)
152
		if (dd->gettingEvent)
153
		    error(_("recursive use of 'getGraphicsEvent' not supported"));
153
		    error(_("recursive use of 'getGraphicsEvent' not supported"));
154
		if (dd->eventEnv != R_NilValue) {
154
		if (dd->eventEnv != R_NilValue) {
155
		    if (dd->eventHelper) dd->eventHelper(dd, 1);
155
		    if (dd->eventHelper) dd->eventHelper(dd, 1);
156
		    dd->gettingEvent = TRUE;
156
		    dd->gettingEvent = true;
157
		    defineVar(install("result"), R_NilValue, dd->eventEnv);
157
		    defineVar(install("result"), R_NilValue, dd->eventEnv);
158
		    count++;
158
		    count++;
159
		}
159
		}
160
	    }
160
	    }
161
	    devNum = nextDevice(devNum);
161
	    devNum = nextDevice(devNum);
Line 196... Line 196...
196
	devNum = curDevice();
196
	devNum = curDevice();
197
	while (i++ < NumDevices()) {
197
	while (i++ < NumDevices()) {
198
	    if ((gd = GEgetDevice(devNum)) && (dd = gd->dev)) {
198
	    if ((gd = GEgetDevice(devNum)) && (dd = gd->dev)) {
199
		if (dd->eventEnv != R_NilValue) {
199
		if (dd->eventEnv != R_NilValue) {
200
		    if (dd->eventHelper) dd->eventHelper(dd, 0);
200
		    if (dd->eventHelper) dd->eventHelper(dd, 0);
201
		    dd->gettingEvent = FALSE;
201
		    dd->gettingEvent = false;
202
		}
202
		}
203
	    }
203
	    }
204
	    devNum = nextDevice(devNum);
204
	    devNum = nextDevice(devNum);
205
	}
205
	}
206
 
206
 
Line 213... Line 213...
213
		  int buttons, double x, double y)
213
		  int buttons, double x, double y)
214
{
214
{
215
    int i;
215
    int i;
216
    SEXP handler, bvec, sx, sy, temp, result;
216
    SEXP handler, bvec, sx, sy, temp, result;
217
 
217
 
218
    dd->gettingEvent = FALSE; /* avoid recursive calls */
218
    dd->gettingEvent = false; /* avoid recursive calls */
219
 
219
 
220
    PROTECT(handler = R_findVar(install(mouseHandlers[event]), dd->eventEnv));
220
    PROTECT(handler = R_findVar(install(mouseHandlers[event]), dd->eventEnv));
221
    if (TYPEOF(handler) == PROMSXP) {
221
    if (TYPEOF(handler) == PROMSXP) {
222
	handler = eval(handler, dd->eventEnv);
222
	handler = eval(handler, dd->eventEnv);
223
	UNPROTECT(1); /* handler */
223
	UNPROTECT(1); /* handler */
Line 244... Line 244...
244
	defineVar(install("result"), result, dd->eventEnv);
244
	defineVar(install("result"), result, dd->eventEnv);
245
	UNPROTECT(5);
245
	UNPROTECT(5);
246
	R_FlushConsole();
246
	R_FlushConsole();
247
    }
247
    }
248
    UNPROTECT(1); /* handler */
248
    UNPROTECT(1); /* handler */
249
    dd->gettingEvent = TRUE;
249
    dd->gettingEvent = true;
250
    return;
250
    return;
251
}
251
}
252
 
252
 
253
static const char * keynames[] =
253
static const char * keynames[] =
254
{"Left", "Up", "Right", "Down",
254
{"Left", "Up", "Right", "Down",
Line 259... Line 259...
259
void doKeybd(pDevDesc dd, R_KeyName rkey,
259
void doKeybd(pDevDesc dd, R_KeyName rkey,
260
	     const char *keyname)
260
	     const char *keyname)
261
{
261
{
262
    SEXP handler, skey, temp, result;
262
    SEXP handler, skey, temp, result;
263
 
263
 
264
    dd->gettingEvent = FALSE; /* avoid recursive calls */
264
    dd->gettingEvent = false; /* avoid recursive calls */
265
 
265
 
266
    PROTECT(handler = R_findVar(install(keybdHandler), dd->eventEnv));
266
    PROTECT(handler = R_findVar(install(keybdHandler), dd->eventEnv));
267
    if (TYPEOF(handler) == PROMSXP) {
267
    if (TYPEOF(handler) == PROMSXP) {
268
	handler = eval(handler, dd->eventEnv);
268
	handler = eval(handler, dd->eventEnv);
269
	UNPROTECT(1); /* handler */
269
	UNPROTECT(1); /* handler */
Line 279... Line 279...
279
	defineVar(install("result"), result, dd->eventEnv);
279
	defineVar(install("result"), result, dd->eventEnv);
280
	UNPROTECT(3);
280
	UNPROTECT(3);
281
	R_FlushConsole();
281
	R_FlushConsole();
282
    }
282
    }
283
    UNPROTECT(1); /* handler */
283
    UNPROTECT(1); /* handler */
284
    dd->gettingEvent = TRUE;
284
    dd->gettingEvent = true;
285
    return;
285
    return;
286
}
286
}
287
 
287
 
288
/* Copy-modified from doKeybd -- Frederick Eaton 12 Jun 2016 */
288
/* Copy-modified from doKeybd -- Frederick Eaton 12 Jun 2016 */
289
/* This "doIdle" (executing new "onIdle" hook) should enable users of
289
/* This "doIdle" (executing new "onIdle" hook) should enable users of
Line 293... Line 293...
293
 */
293
 */
294
void doIdle(pDevDesc dd)
294
void doIdle(pDevDesc dd)
295
{
295
{
296
    SEXP handler, temp, result;
296
    SEXP handler, temp, result;
297
 
297
 
298
    dd->gettingEvent = FALSE; /* avoid recursive calls */
298
    dd->gettingEvent = false; /* avoid recursive calls */
299
 
299
 
300
    PROTECT(handler = R_findVar(install(idleHandler), dd->eventEnv));
300
    PROTECT(handler = R_findVar(install(idleHandler), dd->eventEnv));
301
    if (TYPEOF(handler) == PROMSXP) {
301
    if (TYPEOF(handler) == PROMSXP) {
302
	handler = eval(handler, dd->eventEnv);
302
	handler = eval(handler, dd->eventEnv);
303
	UNPROTECT(1); /* handler */
303
	UNPROTECT(1); /* handler */
Line 312... Line 312...
312
	defineVar(install("result"), result, dd->eventEnv);
312
	defineVar(install("result"), result, dd->eventEnv);
313
	UNPROTECT(2);
313
	UNPROTECT(2);
314
	R_FlushConsole();
314
	R_FlushConsole();
315
    }
315
    }
316
    UNPROTECT(1); /* handler */
316
    UNPROTECT(1); /* handler */
317
    dd->gettingEvent = TRUE;
317
    dd->gettingEvent = true;
318
    return;
318
    return;
319
}
319
}
320
 
320
 
321
Rboolean doesIdle(pDevDesc dd) {
321
Rboolean doesIdle(pDevDesc dd) {
322
    SEXP handler = R_findVar(install(idleHandler), dd->eventEnv);
322
    SEXP handler = R_findVar(install(idleHandler), dd->eventEnv);