The R Project SVN R

Rev

Rev 50746 | Rev 52283 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 50746 Rev 52219
Line 169... Line 169...
169
		     pDevDesc dd);
169
		     pDevDesc dd);
170
static double X11_StrWidth(const char *str, const pGEcontext gc, pDevDesc dd);
170
static double X11_StrWidth(const char *str, const pGEcontext gc, pDevDesc dd);
171
static void X11_Text(double x, double y, const char *str,
171
static void X11_Text(double x, double y, const char *str,
172
		     double rot, double hadj,
172
		     double rot, double hadj,
173
		     const pGEcontext gc, pDevDesc dd);
173
		     const pGEcontext gc, pDevDesc dd);
-
 
174
static void X11_eventHelper(pDevDesc dd, int code);
174
 
175
 
175
	/*************************************************/
176
	/*************************************************/
176
	/* End of list of required device driver actions */
177
	/* End of list of required device driver actions */
177
	/*************************************************/
178
	/*************************************************/
178
 
179
 
Line 1297... Line 1298...
1297
 
1298
 
1298
    memset(&attributes, 0, sizeof(attributes));
1299
    memset(&attributes, 0, sizeof(attributes));
1299
    attributes.background_pixel = whitepixel;
1300
    attributes.background_pixel = whitepixel;
1300
    attributes.border_pixel = blackpixel;
1301
    attributes.border_pixel = blackpixel;
1301
    attributes.backing_store = Always;
1302
    attributes.backing_store = Always;
1302
    attributes.event_mask = ButtonPressMask
1303
    attributes.event_mask = ButtonPressMask 
-
 
1304
      | ButtonMotionMask 
-
 
1305
      | ButtonReleaseMask
1303
      | ExposureMask
1306
      | ExposureMask
1304
      | StructureNotifyMask;
1307
      | StructureNotifyMask
-
 
1308
      | KeyPressMask;
-
 
1309
 
1305
 
1310
 
1306
    if (type == WINDOW) {
1311
    if (type == WINDOW) {
1307
	int alreadyCreated = (xd->window != (Window)NULL);
1312
	int alreadyCreated = (xd->window != (Window)NULL);
1308
	if(alreadyCreated == 0) {
1313
	if(alreadyCreated == 0) {
1309
	    xd->windowWidth = iw = (ISNA(w)?7:w)/pixelWidth();
1314
	    xd->windowWidth = iw = (ISNA(w)?7:w)/pixelWidth();
Line 1467... Line 1472...
1467
	XSaveContext(display, xd->window, devPtrContext, (caddr_t) dd);
1472
	XSaveContext(display, xd->window, devPtrContext, (caddr_t) dd);
1468
 
1473
 
1469
	/* Map the window */
1474
	/* Map the window */
1470
	if(alreadyCreated == 0) {
1475
	if(alreadyCreated == 0) {
1471
	    XSelectInput(display, xd->window,
1476
	    XSelectInput(display, xd->window,
1472
			 ExposureMask | ButtonPressMask | StructureNotifyMask);
1477
			 ExposureMask | ButtonPressMask | StructureNotifyMask 
-
 
1478
			 | ButtonReleaseMask | ButtonMotionMask | KeyPressMask);
1473
	    XMapWindow(display, xd->window);
1479
	    XMapWindow(display, xd->window);
1474
	    XSync(display, 0);
1480
	    XSync(display, 0);
1475
 
1481
 
1476
	    /* Gobble expose events */
1482
	    /* Gobble expose events */
1477
 
1483
 
Line 2270... Line 2276...
2270
    }
2276
    }
2271
    /* if it was a Button1 succeed, otherwise fail */
2277
    /* if it was a Button1 succeed, otherwise fail */
2272
    return (done == 1);
2278
    return (done == 1);
2273
}
2279
}
2274
 
2280
 
-
 
2281
static int translate_key(KeySym keysym)
-
 
2282
{
-
 
2283
    if ((keysym >= XK_F1) && (keysym <= XK_F12))
-
 
2284
    	return knF1 + keysym - XK_F1;
-
 
2285
    else {
-
 
2286
    	switch(keysym) {
-
 
2287
	case XK_Left: return knLEFT;
-
 
2288
	case XK_Up:   return knUP;
-
 
2289
	case XK_Right:return knRIGHT;
-
 
2290
	case XK_Down: return knDOWN;
-
 
2291
	case XK_Page_Up: 	return knPGUP;
-
 
2292
	case XK_Page_Down: 	return knPGDN;
-
 
2293
	case XK_End:  return knEND;
-
 
2294
	case XK_Begin:return knHOME;
-
 
2295
	case XK_Insert:  	return knINS;
-
 
2296
	}
-
 
2297
    }
-
 
2298
    return knUNKNOWN;
-
 
2299
}
-
 
2300
 
-
 
2301
static void X11_eventHelper(pDevDesc dd, int code)
-
 
2302
{
-
 
2303
    XEvent event;
-
 
2304
    pDevDesc ddEvent;
-
 
2305
    pX11Desc xd = (pX11Desc) dd->deviceSpecific;
-
 
2306
    caddr_t temp;
-
 
2307
    int done = 0;
-
 
2308
 
-
 
2309
    if (xd->type > WINDOW) return;
-
 
2310
    if (code == 1) {
-
 
2311
    	R_ProcessX11Events((void*)NULL);	/* discard pending events */
-
 
2312
    	if (isEnvironment(dd->eventEnv)) {
-
 
2313
    	    SEXP prompt = findVar(install("prompt"), dd->eventEnv);
-
 
2314
    	    if (length(prompt) == 1) {
-
 
2315
    		 XStoreName(display, xd->window, CHAR(asChar(prompt)));
-
 
2316
    	    }
-
 
2317
    	}
-
 
2318
    	XSync(display, 1);
-
 
2319
    } else if (code == 2) {
-
 
2320
	XNextEvent(display, &event);
-
 
2321
	if (event.type == ButtonRelease || event.type == ButtonPress || event.type == MotionNotify) {
-
 
2322
	    XFindContext(display, event.xbutton.window,
-
 
2323
			 devPtrContext, &temp);
-
 
2324
	    ddEvent = (pDevDesc) temp;
-
 
2325
	    if (ddEvent == dd && dd->gettingEvent) {
-
 
2326
        	doMouseEvent(dd, event.type == ButtonRelease ? meMouseUp :
-
 
2327
        	                 event.type == ButtonPress ? meMouseDown : meMouseMove, 
-
 
2328
        	                 event.xbutton.button, event.xbutton.x, event.xbutton.y);
-
 
2329
                XSync(display, 0);
-
 
2330
                done = 1;
-
 
2331
    	    }
-
 
2332
	} else if (event.type == KeyPress) {
-
 
2333
	    char keybuffer[13] = "";
-
 
2334
	    char *keystart=keybuffer;
-
 
2335
	    XComposeStatus compose;
-
 
2336
  	    KeySym keysym;
-
 
2337
	    int count, keycode;
-
 
2338
	    if (event.xkey.state & ControlMask) {
-
 
2339
	    	keystart += 5; 
-
 
2340
	    	sprintf(keybuffer, "ctrl-"); /* report control keys using labels like "ctrl-A" */
-
 
2341
	    	event.xkey.state &= !ControlMask;
-
 
2342
	    	event.xkey.state |= ShiftMask;
-
 
2343
	    }
-
 
2344
      	    count = XLookupString(&event.xkey, keystart, sizeof(keybuffer)-(keystart-keybuffer), &keysym, &compose);
-
 
2345
      	    /* Rprintf("keysym=%x\n", keysym); */
-
 
2346
      	    if ((keycode = translate_key(keysym)) > knUNKNOWN)
-
 
2347
      	    	doKeybd(dd, keycode, NULL);
-
 
2348
      	    else if (*keystart)
-
 
2349
	    	doKeybd(dd, knUNKNOWN, keybuffer);
-
 
2350
	    done = 1;
-
 
2351
	}
-
 
2352
	if (!done) 
-
 
2353
	    handleEvent(event);
-
 
2354
    } else if (code == 0) {
-
 
2355
	XStoreName(display, xd->window, xd->title);
-
 
2356
	XSync(display, 0);
-
 
2357
    }
-
 
2358
 
-
 
2359
    return;
-
 
2360
}
-
 
2361
 
2275
	/********************************************************/
2362
	/********************************************************/
2276
	/* device_Mode is called whenever the graphics engine	*/
2363
	/* device_Mode is called whenever the graphics engine	*/
2277
	/* starts drawing (mode=1) or stops drawing (mode=0)	*/
2364
	/* starts drawing (mode=1) or stops drawing (mode=0)	*/
2278
	/* the device is not required to do anything		*/
2365
	/* the device is not required to do anything		*/
2279
	/********************************************************/
2366
	/********************************************************/
Line 2426... Line 2513...
2426
	dd->line = X11_Line;
2513
	dd->line = X11_Line;
2427
	dd->polyline = X11_Polyline;
2514
	dd->polyline = X11_Polyline;
2428
	dd->polygon = X11_Polygon;
2515
	dd->polygon = X11_Polygon;
2429
	dd->metricInfo = X11_MetricInfo;
2516
	dd->metricInfo = X11_MetricInfo;
2430
	dd->hasTextUTF8 = FALSE;
2517
	dd->hasTextUTF8 = FALSE;
-
 
2518
    	dd->eventHelper = X11_eventHelper;
-
 
2519
    	dd->canGenMouseDown = TRUE;
-
 
2520
	dd->canGenMouseUp = TRUE;
-
 
2521
	dd->canGenMouseMove = TRUE;
-
 
2522
	dd->canGenKeybd = TRUE;
2431
    }
2523
    }
2432
 
2524
 
2433
    dd->activate = X11_Activate;
2525
    dd->activate = X11_Activate;
2434
    dd->close = X11_Close;
2526
    dd->close = X11_Close;
2435
    dd->deactivate = X11_Deactivate;
2527
    dd->deactivate = X11_Deactivate;