[Rd] getGraphicsEvent on X11 and event queuing

Martin Maechler maechler at stat.math.ethz.ch
Thu Jun 9 16:52:26 CEST 2016

Hi Frederik,

>>>>>   <frederik at ofb.net>
>>>>>     on Tue, 7 Jun 2016 15:20:05 -0700 writes:

    > ... I just realized that setGraphicsEventHandlers or
    > getGraphicsEvent could have an 'onIdle' callback, to be
    > called somewhere in the polling loop of gevents.c:163 - I
    > think this would solve my problem #2 in a minimally
    > disruptive way.

I hope you will get some feedback about this by one of the
graphics/devices experts from within R core.
I'm not among them at all, but they may be busy or travelling

Also, as you are studying the C code and the issues anyway, it
may be worthwhile to consider (as small as possible!) patches to
the source you could also post to the bugzilla site if you
prefer; attaching as text/plain to R-devel does work fine, too.

Best regards,

    > On Mon, Jun 06, 2016 at 06:38:45PM -0700, frederik at ofb.net
    > wrote:
    >> Hi R-Devel,
    >> I've been working on an oscilloscope project using an
    >> Arduino microcontroller board. I found that it's quite
    >> easy to get realtime updates, e.g. 30+ frames per second,
    >> if I read data from the board in a little Rcpp library. I
    >> have to use dev.hold() and dev.flush() to keep the plot
    >> from flickering, which restricts me to the "cairo" X11
    >> device.
    >> I'd like to be able to add interactivity to the
    >> oscilloscope display, for instance to bind a key to save
    >> the current plot to a file, or to bind keys for adjusting
    >> the time scale etc.
    >> However, I ran into two problems:
    >> (1) setGraphicsEventHandlers only works on the "Xlib" X11
    >> device, which doesn't support buffering via dev.hold() -
    >> it flickers.
    >> (2) getGraphicsEvent and friends lack some interface
    >> features which are needed to use the functions in an
    >> asynchronous fashion. Typically, event listener library
    >> functions have a "timeout" parameter, and the ability to
    >> return already-queued events. But getGraphicsEvent() has
    >> neither - it waits indefinitely (you can't set a
    >> timeout), and it seems to ignore events which occurred
    >> before it was called (I can't figure out why, from the
    >> code, I guess the normal R event processing grabs events
    >> which occur between calls to getGraphicsEvent?).
    >> It seems like it should be possible to set a handler for
    >> keyboard events and have it execute in between plot
    >> updates when the user presses a key - yet without
    >> blocking further updates if no key has been pressed.
    >> Is anyone interested in fixing (1) and (2)? Or is there
    >> some other library or workaround to solve my problems?
    >> Here is some code I used to play around with these
    >> functions:
    >> X11(type="Xlib");
    >> keydown = function(key) { cat("Got key: ",key); lastkey <<- key }
    >> setGraphicsEventHandlers(onKeybd = keydown);
    >> plot(c(0,0)); getGraphicsEvent();
    >> Well, I think it's great that getGraphicsEvent exists at
    >> all, and want to salute Duncan Murdoch who is listed as
    >> the author. I hope I may have helped by describing some
    >> new possible uses for these functions.
    >> Thank you,
    >> Frederick
    >> ______________________________________________
    >> R-devel at r-project.org mailing list
    >> https://stat.ethz.ch/mailman/listinfo/r-devel

    > ______________________________________________
    > R-devel at r-project.org mailing list
    > https://stat.ethz.ch/mailman/listinfo/r-devel

More information about the R-devel mailing list