[R] Determining physical display dimensions
Marc Schwartz
MSchwartz at mn.rr.com
Sat Aug 20 17:52:38 CEST 2005
On Fri, 2005-08-19 at 13:17 -0500, Earl F. Glynn wrote:
> "Berton Gunter" <gunter.berton at gene.com> wrote in message
> news:200508191747.j7JHlEBV017029 at faraday.gene.com...
>
> > Failing that, (how) can this be done for Windows (XP or 2000, say) ?
>
> Take a look at the Windows GetDeviceCaps API call
> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/devcons_88s3.asp
>
> Parameters that can be queried include:
> HORZRES Width, in pixels, of the screen.
> VERTRES Height, in raster lines, of the screen.
>
> HORZSIZE Width, in millimeters, of the physical screen
> VERTSIZE Height, in millimeters, of the physical screen
>
> The specifics of how to use this API call will vary by language. Google
> will be your friend.
FWIW, in case anyone should see this thread and wonder how to do this
somewhat easily in R for systems running X, there is a CLI utility
called 'xdpyinfo' that returns a great deal of data on the connected
display(s).
> display.size <- system("xdpyinfo | grep dimensions", intern = TRUE)
> display.dpi <- system("xdpyinfo | grep resolution", intern = TRUE)
> display.size
[1] " dimensions: 1600x1200 pixels (301x231 millimeters)"
> display.dpi
[1] " resolution: 135x132 dots per inch"
One can then parse the above using R functions as required. Such as:
> d.size <- unlist(strsplit(display.size, split = "[[:space:]|(|)|x]"))
> d.size
[1] "" "" "dimensions:" ""
[5] "" "" "1600" "1200"
[9] "pi" "els" "" "301"
[13] "231" "millimeters"
> h.pix <- as.numeric(d.size[7])
> v.pix <- as.numeric(d.size[8])
> h.mm <- as.numeric(d.size[12])
> v.mm <- as.numeric(d.size[13])
> line1 <- sprintf("The current display is %d x %d pixels",
h.pix, v.pix)
> line2 <- sprintf("with a physical size of %d x %d mm", h.mm, v.mm)
> cat(line1, line2, sep = "\n")
The current display is 1600 x 1200 pixels
with a physical size of 301 x 231 mm
This can get more complicated with multi-monitor systems, depending upon
whether you are running in xinerama (multi-monitor spanning mode) or
non-xinerama mode and consideration for symmetric or asymmetric
resolutions. 'man xdpyinfo' and 'man X' (noting the 'DISPLAY'
environment variable) will be helpful here to determine which
display/screen R is running on.
For example, on my system which has two displays, each with 1600x1200, I
get:
> Sys.getenv("DISPLAY")
DISPLAY
":0.0"
with R running on the main laptop LCD (15" diag), versus:
> Sys.getenv("DISPLAY")
DISPLAY
":0.1"
with R running on the external LCD (20.1" diag), with the DISPLAY
variable indicating:
":DisplayNumber.ScreenNumber"
Thus, on my system, the output of the system() calls are actually:
> display.size <- system("xdpyinfo | grep dimensions", intern = TRUE)
> display.dpi <- system("xdpyinfo | grep resolution", intern = TRUE)
> display.size
[1] " dimensions: 1600x1200 pixels (301x231 millimeters)"
[2] " dimensions: 1600x1200 pixels (411x311 millimeters)"
> display.dpi
[1] " resolution: 135x132 dots per inch"
[2] " resolution: 99x98 dots per inch"
HTH,
Marc Schwartz
More information about the R-help
mailing list