On Wed, Mar 7, 2012 at 1:47 PM, Mark Heckmann <mark.heckmann@gmx.de> wrote:

> Michael, thanks for your answer!
>
> The attribute solution has its problems though.
> First, how it will work:
>
> foo <- function(){
>   w <- gtkWindow()
>   da <- gtkDrawingArea()
>   w$add(da)
>   asCairoDevice(da)
>   print(dev.cur())
>   gObjectSetData(da, "dev.number", data = dev.cur())
>   dev.set(gObjectGetData(da, "dev.number"))
>   par(mar=c(0,0,0,0))
>   plot(1:10)
> }
>
> The problem arises when I try to convert a drawing area to Cairo WITHIN
> another function.
> Than dev.cur() does not work as I expected. The device returned is the
> Null device instead.
>
> foo_2 <- function(){
>   da <- gtkDrawingArea()
>   asCairoDevice(da)
>   print(dev.cur())            # NULL DEVICE!
>   gObjectSetData(da, "dev.number", data = dev.cur())
>   da
> }
>
> foo <- function(){
>   w <- gtkWindow()
>   e <- environment()
>   da <- foo_2()
>   w$add(da)
>   dev.cur()
>   dev.set(gObjectGetData(da, "dev.number"))
>   par(mar=c(0,0,0,0))
>   plot(1:10)
> }
>
> As in most cases the code for creating and converting a drawing area is
> not located in the main function but rather inside a handler etc. the
> attribute solution will often work.
> Or am I missing something here?
>
>
The R graphics device is not actually created until the widget is realized
(in GTK terms), because it cannot plot anything until then. The difference
in the code above is that in the first case you are adding the drawing area
to the visible window (and thus realizing it) prior to calling dev.cur().
The order is reversed in the second case.

Michael

I think this problem is very general when working with RGtk2, Cairo and
> multiple drawing areas (e.g. on notebook tabs).
> So I wonder if there is another way to go about it. Do you have an idea?
>
> Thanks in advance
> --Mark
>
>
> Am 06.03.2012 um 13:52 schrieb Michael Lawrence:
>
> Currently, the GtkDrawingArea object has no real knowledge that it is
> being used as a graphics device. You could do something like: stick the
> device ID on da1/da2 as an attribute, and then have a function that does
> dev.set with that attribute.
>
> Michael
>
> On Mon, Mar 5, 2012 at 1:14 PM, Mark Heckmann <mark.heckmann@gmx.de>wrote:
>
>> I am not too familiar with Cairo and RGtk2 and have the following problem:
>> I have a container with two GTK drawing areas converted into Cairo
>> devices.
>> I know that I can set the current drawing context e.g. using dev.set().
>> But this is tedious. How can I set the context using the objects da1 or
>> da2?
>>
>>  w <- gtkWindow()
>>  w$setSizeRequest(400, 400)
>>  vbox <- gtkVBox()
>>  da1 <- gtkDrawingArea()
>>  da2 <- gtkDrawingArea()
>>  vbox$add(da1)
>>  vbox$add(da2)
>>  dummy <- asCairoDevice(da1)
>>  dummy <- asCairoDevice(da2)
>>  w$add(vbox)
>>  par(oma=c(0,0,0,0), mar=c(0,0,0,0))
>>  plot(1:10)
>>
>> THX
>> --Mark
>> 末末末末末末末末末末末末末末末末末末
>> Mark Heckmann
>> Blog: www.markheckmann.de
>> R-Blog: http://ryouready.wordpress.com
>>
>> ______________________________________________
>> R-help@r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>
>
> 末末末末末末末末末末末末末末末末末末
> Mark Heckmann
> Blog: www.markheckmann.de
> R-Blog: http://ryouready.wordpress.com
>
>
>
>
>
>
>
>
>
>
>

	[[alternative HTML version deleted]]

