\HeaderA{grid.locator}{Capture a Mouse Click}{grid.locator}
\keyword{dplot}{grid.locator}
\begin{Description}\relax
Allows the user to click the mouse once within the current
graphics
device and returns the location of the mouse click within the
current viewport, in the specified coordinate system.
\end{Description}
\begin{Usage}
\begin{verbatim}
grid.locator(unit = "native")
\end{verbatim}
\end{Usage}
\begin{Arguments}
\begin{ldescription}
\item[\code{unit}] The coordinate system in which to return the location
of the mouse click.
See the \code{\LinkA{unit}{unit}} function for valid coordinate systems.
\end{ldescription}
\end{Arguments}
\begin{Details}\relax
This function is modal (like the graphics package
function \code{locator}) so
the command line and graphics drawing is blocked until
the use has clicked the mouse  in the current device.
\end{Details}
\begin{Value}
A unit object representing the location of the mouse click within the
current viewport, in the specified coordinate system.

If the user did not click mouse button 1, the function
(invisibly) returns \code{NULL}.
\end{Value}
\begin{Author}\relax
Paul Murrell
\end{Author}
\begin{SeeAlso}\relax
\code{\LinkA{viewport}{viewport}}, \code{\LinkA{unit}{unit}},
\code{locator} in package graphics, and for an application
see \code{trellis.focus} and \code{trellis.identify} in
package lattice.
\end{SeeAlso}
\begin{Examples}
\begin{ExampleCode}
if (interactive()) {
  ## Need to write a more sophisticated unit as.character method
  unittrim <- function(unit) {
    sub("^([0-9]+|[0-9]+[.][0-9])[0-9]*", "\\1", as.character(unit))
  }
  do.click <- function(unit) {
    click.locn <- grid.locator(unit)
    grid.segments(unit.c(click.locn$x, unit(0, "npc")),
                  unit.c(unit(0, "npc"), click.locn$y),
                  click.locn$x, click.locn$y,
                  gp=gpar(lty="dashed", col="grey"))
    grid.points(click.locn$x, click.locn$y, pch=16, size=unit(1, "mm"))
    clickx <- unittrim(click.locn$x)
    clicky <- unittrim(click.locn$y)
    grid.text(paste("(", clickx, ", ", clicky, ")", sep=""),
              click.locn$x + unit(2, "mm"), click.locn$y,
              just="left")
  }
  do.click("inches")
  pushViewport(viewport(width=0.5, height=0.5,
                         xscale=c(0, 100), yscale=c(0, 10)))
  grid.rect()
  grid.xaxis()
  grid.yaxis()
  do.click("native")
  popViewport()  
}
\end{ExampleCode}
\end{Examples}

