From p.dalgaard at biostat.ku.dk  Tue Apr 26 17:39:45 2005
From: p.dalgaard at biostat.ku.dk (Peter Dalgaard)
Date: Tue Apr 26 17:41:22 2005
Subject: [Rd] tclServiceMode:  stop Tcl/Tk from updating
In-Reply-To: <20050426150019.FIMB27245.tomts25-srv.bellnexxia.net@JohnDesktop8300>
References: <20050426150019.FIMB27245.tomts25-srv.bellnexxia.net@JohnDesktop8300>
Message-ID: <x2r7gxsg1q.fsf@turmalin.kubism.ku.dk>

"John Fox" <jfox@mcmaster.ca> writes:

> Dear Duncan,
> 
> I hope that some follow-up questions are in order:
> 
> In the Rcdmr package, there is a pair of functions for initializing and
> completing dialogs:
> 
> initializeDialog <- defmacro(window=top, title="", offset=10,
>     expr={
>         window <- tktoplevel(borderwidth=10)
>         tkwm.title(window, title)
>         position <- if (is.SciViews()) -1 else commanderPosition() # +PhG
>         position <- if (any(position < 0)) "-50+50"
>             else paste("+", paste(offset + position, collapse="+"), sep="")
>         tkwm.geometry(window, position)
>         }
>     )
> 
> dialogSuffix <- defmacro(window=top, onOK=onOK, rows=1, columns=1,
> focus=top,
>     bindReturn=TRUE, preventGrabFocus=FALSE, preventDoubleClick=FALSE,
>     expr={
>         for (row in 0:(rows-1)) tkgrid.rowconfigure(window, row, weight=0)
>         for (col in 0:(columns-1)) tkgrid.columnconfigure(window, col,
> weight=0)
>         .Tcl("update idletasks")
>         tkwm.resizable(window, 0, 0)
>         if (bindReturn) tkbind(window, "<Return>", onOK)
>         if (getRcmdr("double.click") && (!preventDoubleClick))
> tkbind(window, "<Double-ButtonPress-1>", onOK)
>         tkwm.deiconify(window)
>         # focus grabs appear to cause problems for some dialogs
>         if (GrabFocus() && (!preventGrabFocus)) tkgrab.set(window)
>         tkfocus(focus)
>         tkwait.window(window)
>         }
>     )
> 
> (Both of these are "macro-like" in the sense of Thomas Lumley's R-news
> article.)
> 
> If I understand you correctly, I could improve the R Commander's stability
> under windows by putting tclServiceMode(on = FALSE) at the beginning of
> initializeDialog(), and tclServiceMode(on = TRUE) at the end of
> dialogSuffix(). Is that correct? If so, is there any harm in doing this on
> other platforms, or should I test for Windows? Finally, do you mind if I put
> tclServiceMode() in the Rcmdr package for the time-being, or would it just
> be better to wait for R 2.1.1?

It's a horrible kludge (I can say so because I suggested it) and a
sign that we don't really understand the way the Tk event loop runs on
Windows. 

However, as far as I can tell, it should be harmless to use
tclServiceMode() on other platforms, as long as you ensure that
on=TRUE is used whenever you do want to process events. Mostly, you'll
just be disabling event processing at points where you weren't
handling events anyway.

If you use things like tkwait.variable() when on=FALSE, then you're in
trouble, but that goes for all platforms.

-- 
   O__  ---- Peter Dalgaard             Blegdamsvej 3  
  c/ /'_ --- Dept. of Biostatistics     2200 Cph. N   
 (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard@biostat.ku.dk)             FAX: (+45) 35327907


[Rd] tclServiceMode: stop Tcl/Tk from updating
Peter Dalgaard