From frederik at ofb.net  Mon Nov 14 02:53:25 2016
From: frederik at ofb.net (frederik at ofb.net)
Date: Sun, 13 Nov 2016 17:53:25 -0800
Subject: [Rd] getGraphicsEvent() alternative for cairo graphics device?
In-Reply-To: <25bfd94c-28f6-595e-ffb1-2ae2421b5135@stat.auckland.ac.nz>
References: <CAN_GHySs42vK5U1xZYP8h7ZPdFyOcHnEZK4Sn91e7htv=7E54A@mail.gmail.com>
	<20160725191747.GB18530@ofb.net>
	<57968357.2030509@stat.auckland.ac.nz>
	<20161112200028.GD24681@ofb.net>
	<2e6f0306-da86-211a-05dd-aff3d744df40@stat.auckland.ac.nz>
	<20161114004137.GA21456@ofb.net>
	<25bfd94c-28f6-595e-ffb1-2ae2421b5135@stat.auckland.ac.nz>
Message-ID: <20161114015325.GB21456@ofb.net>

Hi Paul,

OK I tried not to make the examples too fancy.

Please let me know what you think. They should probably be amended to
support the Windows platform, but I think that task would be much
easier for someone with access to Windows...

By the way I'm Cc'ing Mark O'Connell who shared with me some great
getGraphicsEvent examples - well, I found them useful, perhaps if
these are going to the R distro somewhere, then his examples should be
included as well.

Thank you,

Frederick

On Mon, Nov 14, 2016 at 01:51:08PM +1300, Paul Murrell wrote:
> 
> Great.  Thanks!
> 
> Paul
> 
> On 14/11/16 13:41, frederik at ofb.net wrote:
> > Hi Paul,
> > 
> > Thank you, for some reason I didn't seem to get an email notification
> > for your bugzilla comment!
> > 
> > I will try to send you something shortly.
> > 
> > Frederick
> > 
> > On Mon, Nov 14, 2016 at 08:55:20AM +1300, Paul Murrell wrote:
> > > Hi
> > > 
> > > The current status is that I am keen for people to contribute some testing
> > > code (see https://bugs.r-project.org/bugzilla/show_bug.cgi?id=16951)
> > > 
> > > There were also some getGraphicsEvent() changes/fixes suggested by Richard
> > > Bodewits (cc'ed), for which I am also seeking test code.
> > > 
> > > Paul
> > > 
> > > On 13/11/16 09:00, frederik at ofb.net wrote:
> > > > Hi Paul,
> > > > 
> > > > Just checking in to see what the status is.
> > > > 
> > > > From my perspective it seems logical to split off X11 into a separate
> > > > package, so development can proceed at a reasonable rate, but I
> > > > haven't yet tried to see if that's even possible.
> > > > 
> > > > Thanks,
> > > > 
> > > > Frederick
> > > > 
> > > > On Tue, Jul 26, 2016 at 09:23:35AM +1200, Paul Murrell wrote:
> > > > > Hi
> > > > > 
> > > > > Taking a look at those patches is now on my todo list, so I may be in touch
> > > > > with both of you at some point to request some testing.
> > > > > 
> > > > > Paul
> > > > > 
> > > > > On 26/07/16 07:17, frederik at ofb.net wrote:
> > > > > > Dear Daniel Greenidge,
> > > > > > 
> > > > > > To enable getGraphicsEvent on Cairo, you have two patches to choose
> > > > > > from:
> > > > > > 
> > > > > > https://bugs.r-project.org/bugzilla/show_bug.cgi?id=14364
> > > > > > https://bugs.r-project.org/bugzilla/show_bug.cgi?id=16951
> > > > > > 
> > > > > > The second one is by me, and the first one is from five years ago by
> > > > > > Hugo Mildenberger.
> > > > > > 
> > > > > > Both patches are very simple, they move some lines enabling
> > > > > > getGrahpicsEvent outside of a if(!cairo) statement. My patch also adds
> > > > > > the ability to execute code (e.g. for animation) while the interface
> > > > > > is idle.
> > > > > > 
> > > > > > Top guy Duncan Murdoch has expressed that he doesn't have time to work
> > > > > > on applying these patches, and I haven't had any responses from the
> > > > > > rest of the R Core Team. I was thinking that perhaps your best bet is
> > > > > > to try to create a package called e.g. "X11-fixes" which people can
> > > > > > use to get a better X11 library (there is also a bug waiting to be
> > > > > > fixed from 2001:
> > > > > > https://bugs.r-project.org/bugzilla/show_bug.cgi?id=16702).
> > > > > > 
> > > > > > I don't know if CRAN would accept such a package, or if you'd have to
> > > > > > distribute it via GitHub, but R has excellent tools to facilitate the
> > > > > > distribution of code via packages. Whether the R kernel exports enough
> > > > > > functions to allow a package to take over event handling, I'm not
> > > > > > sure. I was intending to look more into the details of this
> > > > > > possibility but haven't had time.
> > > > > > 
> > > > > > Best wishes,
> > > > > > 
> > > > > > Frederick
> > > > > > 
> > > > > > On Mon, Jul 25, 2016 at 02:15:59PM -0400, Daniel Greenidge wrote:
> > > > > > > Hi all,
> > > > > > > 
> > > > > > > I'm writing an interactive plotting function for viewing fMRI
> > > > > > > datasets. Currently, I get keypresses using
> > > > > > > grDevices::getGraphicsEvent().
> > > > > > > 
> > > > > > > Unfortunately getGraphicsEvent() only supports the X11(type="Xlib")
> > > > > > > graphics device on Unix systems. The Xlib device doesn't support
> > > > > > > buffering (i.e. dev.hold() and dev.flush()), so redrawing the plots
> > > > > > > causes lots of flickering.
> > > > > > > 
> > > > > > > Is there a way to get keypresses while using the cairo graphics
> > > > > > > device? Alternatively, is there a way to prevent flickering with the
> > > > > > > Xlib graphics device?
> > > > > > > 
> > > > > > > Best,
> > > > > > > Daniel Greenidge
> > > > > > > 
> > > > > > > ______________________________________________
> > > > > > > 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
> > > > > > 
> > > > > 
> > > > > --
> > > > > Dr Paul Murrell
> > > > > Department of Statistics
> > > > > The University of Auckland
> > > > > Private Bag 92019
> > > > > Auckland
> > > > > New Zealand
> > > > > 64 9 3737599 x85392
> > > > > paul at stat.auckland.ac.nz
> > > > > http://www.stat.auckland.ac.nz/~paul/
> > > > > 
> > > 
> > > --
> > > Dr Paul Murrell
> > > Department of Statistics
> > > The University of Auckland
> > > Private Bag 92019
> > > Auckland
> > > New Zealand
> > > 64 9 3737599 x85392
> > > paul at stat.auckland.ac.nz
> > > http://www.stat.auckland.ac.nz/~paul/
> > > 
> 
> -- 
> Dr Paul Murrell
> Department of Statistics
> The University of Auckland
> Private Bag 92019
> Auckland
> New Zealand
> 64 9 3737599 x85392
> paul at stat.auckland.ac.nz
> http://www.stat.auckland.ac.nz/~paul/
> 
-------------- next part --------------
# Examples for "onIdle" function in getGraphicsEvent
# FHE 13 Nov 2016 - public domain

# This should produce a "plot" display with 50 random points connected
# by lines. The points will scroll to the right at a fixed speed,
# which depends on how fast your computer is. Closing the plot window
# should terminate the function cleanly, and pressing Ctrl-C at the
# prompt should have the same effect.
testIdle1 = function() {
  # cairo is the flicker-free option for X11
  X11(type="cairo");
  on.exit(dev.off());

  ps=matrix(runif(100),ncol=2)
  getGraphicsEvent(
                   onIdle=function() {
                     plot(ps[,1],ps[,2],type="b",
                          xlim=c(0,1),ylim=c(0,1));
                     ps<<-t(t(ps)+c(0.001,0)) %% 1
                     NULL
                   }
                   );
}

# This is a more interactive example. You have to move the mouse to
# start, and then the mouse will leave a trail which shrinks and
# rotates towards the center of the screen. There is a 0.01 second
# delay (currently Linux-specific, since Sys.sleep() can't be used in
# onIdle) between successive updates, so, unlike the first example,
# this shouldn't use 100% of your CPU (I measured 20% on a 3.7GHz
# Xeon). Closing the window or pressing "q" should terminate the
# function, but sometimes Ctrl-C at the prompt is ignored due to the
# system() call.
testIdle2 = function(factor=0.99,theta=0.03) {
  n=200;

  xform=factor*
    rbind(c(cos(theta),-sin(theta)),
          c(sin(theta),cos(theta)));
  
  lastp=c(0,0);
  ps=matrix(lastp,ncol=2);

  # cairo is the flicker-free option for X11
  X11(type="cairo");
  on.exit(dev.off());

  getGraphicsEvent(
                   onIdle=function() {
                     plot(ps[,1],ps[,2],
                          xlim=c(-1,1),ylim=c(-1,1),type="l");
                     
                     ps<<-head(rbind(lastp,ps%*%xform),n);

                     # for Windows, comment or change appropriately
                     system("sleep 0.02");
                     
                     NULL
                   },
                   onMouseMove=function(buttons,x,y) {
                     newX=grconvertX(x,"ndc","user");
                     newY=grconvertY(y,"ndc","user");
                     lastp<<-c(newX,newY);
                     NULL;
                   },
                   onKeybd=function(key) {
                     if(key=="q") { 1 }
                     else { NULL }
                   }
                   );
}


[Rd] getGraphicsEvent() alternative for cairo graphics device?
frederik at ofb.net