Tk Source Code

View Ticket
Ticket UUID: 220936
Title: conceal Tk's privates :)
Type: RFE Version: None
Submitter: welch Created on: 2000-11-01 01:31:32
Subsystem: None Assigned To: dgp
Priority: 5 Medium Severity:
Status: Closed Last Modified: 2001-08-16 02:39:54
Resolution: Accepted Closed By: dgp
    Closed on: 2001-08-15 19:39:54
OriginalBugID: 6016 RFE
Version: 8.4a1
SubmitDate: '2000-07-17'
Severity: SER
Status: UnAssn
Submitter: techsupp
OS: All

Don Porter

2000-07-16 state of CVS repository

Please note that this patch does not move
    any of Tk's *public* commands into ::tk as
    I've been advocating recently in comp.lang.tcl.
    It moves only private commands and variables,
    which should be harmless to those who've
    resisted the temptation to directly access
    Tk's privates.
    I expect to submit another patch offering
    a compatibility interface to support those
    who have their code broken by this patch
    because they relied on undocumented private
    interfaces.  Stay tuned.

In addition to the commands and variables which
comprise Tk's public interface, Tk defines many
other commands and variables intended for its
own private use only.  It is a legacy from
Tk 4 that many of these private commands and
variables are defined in the global namespace.

I request that Tk's privates be placed in
the ::tk namespace or its child namespaces.
I include a patch which I think does the job,
but this is a big task, so it would be good
to have others check my work -- especially
on other platforms.

On my Linux/x86 box, the Tk test suite shows
no failed tests both before and after this
patch is applied.

The patch is too large (584kB) to inflict on
the web form / newsgroup.  Instead, download
it from:

File: tkvars.n          Status: Locally Modified
    File: tkBind.c          Status: Locally Modified
    File: tkMenu.c          Status: Locally Modified
    File: tkTextDisp.c      Status: Locally Modified
    File: bgerror.tcl       Status: Locally Modified
    File: button.tcl        Status: Locally Modified
    File: choosedir.tcl     Status: Locally Modified
    File: clrpick.tcl       Status: Locally Modified
    File: comdlg.tcl        Status: Locally Modified
    File: console.tcl       Status: Locally Modified
    File: dialog.tcl        Status: Locally Modified
    File: entry.tcl         Status: Locally Modified
    File: focus.tcl         Status: Locally Modified
    File: listbox.tcl       Status: Locally Modified
    File: menu.tcl          Status: Locally Modified
    File: msgbox.tcl        Status: Locally Modified
    File: optMenu.tcl       Status: Locally Modified
    File: palette.tcl       Status: Locally Modified
    File: scale.tcl         Status: Locally Modified
    File: scrlbar.tcl       Status: Locally Modified
    File: spinbox.tcl       Status: Locally Modified
    File: tclIndex          Status: Locally Modified
    File: tearoff.tcl       Status: Locally Modified
    File: text.tcl          Status: Locally Modified
    File: tk.tcl            Status: Locally Modified
    File: tkfbox.tcl        Status: Locally Modified
    File: xmfbox.tcl        Status: Locally Modified
    File: tkMacMenu.c       Status: Locally Modified
    File: all.tcl           Status: Locally Modified
    File: clrpick.test      Status: Locally Modified
    File: filebox.test      Status: Locally Modified
    File: macMenu.test      Status: Locally Modified
    File: menu.test         Status: Locally Modified
    File: menuDraw.test     Status: Locally Modified
    File: msgbox.test       Status: Locally Modified
    File: text.test         Status: Locally Modified
    File: textDisp.test     Status: Locally Modified
    File: unixMenu.test     Status: Locally Modified
    File: winMenu.test      Status: Locally Modified
    File: xmfbox.test       Status: Locally Modified
    File: tkUnixDialog.c    Status: Locally Modified
User Comments: dgp added on 2001-08-16 02:39:54:
Logged In: YES 

Now the reports are starting to come in about
packages that relied on the Tk internals.
Especially widespread is use of [tkCancelRepeat].

Here's a list I received in e-mail:

following a list of all related packages produced by
grepping for "tkCancelRepeat" in my local archives:

BrowsX                  brx.linux.bin-1.5.0
ClassyTcl               ClassyTk-1.0.0.src.tar.bz2
Gepetto                 gepetto-0.12.tar.gz
Memchan                 memchan2.1p2.tar.gz
Tcl-Plugin              tclplug20-x86-linux2.tar.gz
Sybase                  wisql5.1.tar.gz
Tix                     tix8.2.0b1.tar.bz2
VU                      vu_cvs
[incr]tcl               itcl3.2.0.tar.bz2
MASH                    mash-src-5.1.4.tar.bz2
impress-1.1-b6          imp1.1b.tar.gz
tkgraph                 tkgraph-2.0.4.tar.gz 
Nebula Device           nebula09Jan01.tar.bz2
MicroLinux              muTCL.tar.bz2
TkDesk                  tkdesk-1.2.tar.bz2 
wrap                    wrap0.3.tar.bz2 
TclPro                  (ofcourse)
Ruby                    tcltk-ext04.tar.gz

TSIPP Workbench         TSIPPwb1.4.tar.bz2
Xtask                   Xtask.tar.gz
Agentk Widgets          agentk1.0b4.tar.gz   
ASED                    ased208.tar.gz
Cbrowser                cbrowser-0.8.tar.gz
Combobox (Oakley)       combobox-2.0.tar.gz
tkCVS                   tkcvs-7.0.tar.gz
Tuba                    tuba-2.5.b1.tar.gz
Widgets(Hobbs)          widget-20010630.tar.gz
Getleft                 Getleft-0.10.0.tar.gz
AlphaTk                 alphatk050301.tar.gz
Vtcl                    vtcl-1.5.2.tar.gz
Vtcl                    vtcl-combobox-2.0.tar.gz

Any assistance tracking down the authors of these
packages, alerting them to the issue and offering
them workaround patches like:

if {![llength [info commands tkCancelRepeat]]} {
    ::tk::unsupported::ExposePrivateCommand tkCancelRepeat

would be appreciated.

A TIP for a properly public form of tkCancelRepeat is
probably also in order.

dgp added on 2001-08-01 23:25:25:
Logged In: YES 

Committed implementation for release in Tk 8.4.

dgp added on 2001-07-31 02:15:55:
Logged In: YES 

I think this is ready for commit.  There are
lots of changes, but they're all pretty mechanical.
The test suite indicates no new failures.

I'll commit to HEAD on Wednesday unless I hear
from a maintainer that wants more time to review
over the changes.

dgp added on 2001-07-19 23:30:10:

File Added - 8605: tkpriv.patch.gz

dgp added on 2001-07-19 23:26:26:
Logged In: YES 

Here are the changes as a unidiff patch against the
current (2001-07-19) HEAD.

dgp added on 2001-07-19 00:25:41:
Logged In: YES 

The changes on branch dgp-privates-into-namespace
affect the following maintainer areas:

[console]JH, CM
Generic MenusJH, TH
Error HandlingJH
[*button] and [label]AF, JH, DAS
[tk_chooseDirectory]DKF, JH
[tk_chooseColor]DKF, JH
Generic Dialog SupportDKF, JH
[tk_dialog]DKF, JH, DAS
[entry]AF, JH
[listbox]AF, JH
[tk_messageBox]DKF, JH
[scale]JH, DAS
[scrollbar]JH, DAS
[tk_get*File]DKF, JH
Mac MenusGBS, DAS
Unix MenusJH, TH
Win MenusJH, TH

dgp added on 2001-07-17 08:15:58:
Logged In: YES 

See TIP 44:

dgp added on 2001-03-01 07:30:49:
Logged In: YES 

A first cut at this project has been committed to the
feature branch labeled by branch tag
dgp-privates-into-namespace in the Tk repository.

All Tk users are encouraged to try it out and post
feedback on problems that arise due to the changes.

dgp added on 2000-11-21 03:47:26:
Note also the following additional patch that
was submitted to the Ajuba bug DB, but apparently
did not make the move to SourceForge.  (I can no
longer find it at Ajuba either.  Good thing I
was e-mailed a copy!):

Tk 8.4a1 Feature

Name:  Don Porter
email:  [email protected]
Support:  None
Severity:  2
OperatingSystem:  All
CustomShell:  I've already applied my
"conceal Tk's privates" patch.
It does not yet appear in the bug
DB, so sorry, no ticket reference.
Synopsis:  compatibility interface for Tk privates

As proposed on c.l.t., this patch adds two
commands, [::tk::unsupported::ExposePrivateCommand]
and [::tk::unsupported::ExposePrivateVariable] to
allow those who need access to Tk's privates to
support their old scripts to gain that access when
using a Tk patched to conceal those privates.

There may be better ways to support this
compatibility, but at least this is an
existence proof.

*** tk.tcl.old  Wed Aug  2 10:51:25 2000
--- tk.tcl      Wed Aug  2 10:44:59 2000
*** 359,361 ****
--- 359,601 ----
      focus $w
+ # ----------------------------------------------------------------------
+ # Unsupported compatibility interface for folks accessing Tk's private
+ # commands and variable against recommended usage.
+ # ----------------------------------------------------------------------
+ namespace eval ::tk::unsupported {
+     variable PrivateCommands 
+     array set PrivateCommands {
+       tkButtonAutoInvoke              ::tk::ButtonAutoInvoke
+       tkButtonDown                    ::tk::ButtonDown
+       tkButtonEnter                   ::tk::ButtonEnter
+       tkButtonInvoke                  ::tk::ButtonInvoke
+       tkButtonLeave                   ::tk::ButtonLeave
+       tkButtonUp                      ::tk::ButtonUp
+       tkCancelRepeat                  ::tk::CancelRepeat
+       tkCheckRadioDown                ::tk::CheckRadioDown
+       tkCheckRadioEnter               ::tk::CheckRadioEnter
+       tkCheckRadioInvoke              ::tk::CheckRadioInvoke
+       tkColorDialog                   ::tk::dialog::color::
+       tkColorDialog_BuildDialog       ::tk::dialog::color::BuildDialog
+       tkColorDialog_CancelCmd         ::tk::dialog::color::CancelCmd
+       tkColorDialog_Config            ::tk::dialog::color::Config
+       tkColorDialog_CreateSelector    ::tk::dialog::color::CreateSelector
+       tkColorDialog_DrawColorScale    ::tk::dialog::color::DrawColorScale
+       tkColorDialog_EnterColorBar     ::tk::dialog::color::EnterColorBar
+       tkColorDialog_InitValues        ::tk::dialog::color::InitValues
+       tkColorDialog_HandleRGBEntry    ::tk::dialog::color::HandleRGBEntry
+       tkColorDialog_HandleSelEntry    ::tk::dialog::color::HandleSelEntry
+       tkColorDialog_LeaveColorBar     ::tk::dialog::color::LeaveColorBar
+       tkColorDialog_MoveSelector      ::tk::dialog::color::MoveSelector
+       tkColorDialog_OkCmd             ::tk::dialog::color::OkCmd
+       tkColorDialog_RedrawColorBars   ::tk::dialog::color::RedrawColorBars
+       tkColorDialog_RedrawFinalColor  ::tk::dialog::color::RedrawFinalColor
+       tkColorDialog_ReleaseMouse      ::tk::dialog::color::ReleaseMouse
+       tkColorDialog_ResizeColorBars   ::tk::dialog::color::ResizeColorBars
+       tkColorDialog_RgbToX            ::tk::dialog::color::RgbToX
+       tkColorDialog_SetRGBValue       ::tk::dialog::color::SetRGBValue
+       tkColorDialog_StartMove         ::tk::dialog::color::StartMove
+       tkColorDialog_XToRgb            ::tk::dialog::color::XToRGB
+       tkConsoleAbout                  ::tk::ConsoleAbout
+       tkConsoleBind                   ::tk::ConsoleBind
+       tkConsoleExit                   ::tk::ConsoleExit
+       tkConsoleHistory                ::tk::ConsoleHistory
+       tkConsoleInit                   ::tk::ConsoleInit
+       tkConsoleInsert                 ::tk::ConsoleInsert
+       tkConsoleInvoke                 ::tk::ConsoleInvoke
+       tkConsoleOutput                 ::tk::ConsoleOutput
+       tkConsolePrompt                 ::tk::ConsolePrompt
+       tkConsoleSource                 ::tk::ConsoleSource
+       tkDarken                        ::tk::Darken
+       tkEntryAutoScan                 ::tk::EntryAutoScan
+       tkEntryBackspace                ::tk::EntryBackspace
+       tkEntryButton1                  ::tk::EntryButton1
+       tkEntryClosestGap               ::tk::EntryClosestGap
+       tkEntryGetSelection             ::tk::EntryGetSelection
+       tkEntryInsert                   ::tk::EntryInsert
+       tkEntryKeySelect                ::tk::EntryKeySelect
+       tkEntryMouseSelect              ::tk::EntryMouseSelect
+       tkEntryNextWord                 ::tk::EntryNextWord
+       tkEntryPaste                    ::tk::EntryPaste
+       tkEntryPreviousWord             ::tk::EntryPreviousWord
+       tkEntrySeeInsert                ::tk::EntrySeeInsert
+       tkEntrySetCursor                ::tk::EntrySetCursor
+       tkEntryTranspose                ::tk::EntryTranspose
+       tkEventMotifBindings            ::tk::EventMotifBindings
+       tkFDGetFileTypes                ::tk::FDGetFileTypes
+       tkFirstMenu                     ::tk::FirstMenu
+       tkFocusGroup_BindIn             ::tk::FocusGroup_BindIn
+       tkFocusGroup_BindOut            ::tk::FocusGroup_BindOut
+       tkFocusGroup_Create             ::tk::FocusGroup_Create
+       tkFocusGroup_Destroy            ::tk::FocusGroup_Destroy
+       tkFocusGroup_In                 ::tk::FocusGroup_In
+       tkFocusGroup_Out                ::tk::FocusGroup_Out
+       tkFocusOK                       ::tk::FocusOK
+       tkGenerateMenuSelect            ::tk::GenerateMenuSelect
+       tkIconList                      ::tk::IconList
+       tkIconList_Add                  ::tk::IconList_Add
+       tkIconList_Arrange              ::tk::IconList_Arrange
+       tkIconList_AutoScan             ::tk::IconList_AutoScan
+       tkIconList_Btn1                 ::tk::IconList_Btn1
+       tkIconList_Config               ::tk::IconList_Config
+       tkIconList_Create               ::tk::IconList_Create
+       tkIconList_CtrlBtn1             ::tk::IconList_CtrlBtn1
+       tkIconList_Curselection         ::tk::IconList_Curselection
+       tkIconList_DeleteAll            ::tk::IconList_DeleteAll
+       tkIconList_Double1              ::tk::IconList_Double1
+       tkIconList_DrawSelection        ::tk::IconList_DrawSelection
+       tkIconList_FocusIn              ::tk::IconList_FocusIn
+       tkIconList_FocusOut             ::tk::IconList_FocusOut
+       tkIconList_Get                  ::tk::IconList_Get
+       tkIconList_Goto                 ::tk::IconList_Goto
+       tkIconList_Index                ::tk::IconList_Index
+       tkIconList_Invoke               ::tk::IconList_Invoke
+       tkIconList_KeyPress             ::tk::IconList_KeyPress
+       tkIconList_Leave1               ::tk::IconList_Leave1
+       tkIconList_LeftRight            ::tk::IconList_LeftRight
+       tkIconList_Motion1              ::tk::IconList_Motion1
+       tkIconList_Reset                ::tk::IconList_Reset
+       tkIconList_ReturnKey            ::tk::IconList_ReturnKey
+       tkIconList_See                  ::tk::IconList_See
+       tkIconList_Select               ::tk::IconList_Select
+       tkIconList_Selection            ::tk::IconList_Selection
+       tkIconList_ShiftBtn1            ::tk::IconList_ShiftBtn1
+       tkIconList_UpDown               ::tk::IconList_UpDown
+       tkListbox                       ::tk::Listbox
+       tkListboxAutoScan               ::tk::ListboxAutoScan
+       tkListboxBeginExtend            ::tk::ListboxBeginExtend
+       tkListboxBeginSelect            ::tk::ListboxBeginSelect
+       tkListboxBeginToggle            ::tk::ListboxBeginToggle
+       tkListboxCancel                 ::tk::ListboxCancel
+       tkListboxDataExtend             ::tk::ListboxDataExtend
+       tkListboxExtendUpDown           ::tk::ListboxExtendUpDown
+       tkListboxKeyAccel_Goto          ::tk::ListboxKeyAccel_Goto
+       tkListboxKeyAccel_Key           ::tk::ListboxKeyAccel_Key
+       tkListboxKeyAccel_Reset         ::tk::ListboxKeyAccel_Reset
+       tkListboxKeyAccel_Set           ::tk::ListboxKeyAccel_Set
+       tkListboxKeyAccel_Unset         ::tk::ListboxKeyAccel_Unxet
+       tkListboxMotion                 ::tk::ListboxMotion
+       tkListboxSelectAll              ::tk::ListboxSelectAll
+       tkListboxUpDown                 ::tk::ListboxUpDown
+       tkListboxBeginToggle            ::tk::ListboxBeginToggle
+       tkMbButtonUp                    ::tk::MbButtonUp
+       tkMbEnter                       ::tk::MbEnter
+       tkMbLeave                       ::tk::MbLeave
+       tkMbMotion                      ::tk::MbMotion
+       tkMbPost                        ::tk::MbPost
+       tkMenuButtonDown                ::tk::MenuButtonDown
+       tkMenuDownArrow                 ::tk::MenuDownArrow
+       tkMenuDup                       ::tk::MenuDup
+       tkMenuEscape                    ::tk::MenuEscape
+       tkMenuFind                      ::tk::MenuFind
+       tkMenuFindName                  ::tk::MenuFindName
+       tkMenuFirstEntry                ::tk::MenuFirstEntry
+       tkMenuInvoke                    ::tk::MenuInvoke
+       tkMenuLeave                     ::tk::MenuLeave
+       tkMenuLeftArrow                 ::tk::MenuLeftArrow
+       tkMenuMotion                    ::tk::MenuMotion
+       tkMenuNextEntry                 ::tk::MenuNextEntry
+       tkMenuNextMenu                  ::tk::MenuNextMenu
+       tkMenuRightArrow                ::tk::MenuRightArrow
+       tkMenuUnpost                    ::tk::MenuUnpost
+       tkMenuUpArrow                   ::tk::MenuUpArrow
+       tkMessageBox                    ::tk::MessageBox
+       tkMotifFDialog                  ::tk::MotifFDialog
+       tkMotifFDialog_ActivateDList    ::tk::MotifFDialog_ActivateDList
+       tkMotifFDialog_ActivateFList    ::tk::MotifFDialog_ActivateFList
+       tkMotifFDialog_ActivateFEnt     ::tk::MotifFDialog_ActivateFEnt
+       tkMotifFDialog_ActivateSEnt     ::tk::MotifFDialog_ActivateSEnt
+       tkMotifFDialog                  ::tk::MotifFDialog
+       tkMotifFDialog_BrowseDList      ::tk::MotifFDialog_BrowseDList
+       tkMotifFDialog_BrowseFList      ::tk::MotifFDialog_BrowseFList
+       tkMotifFDialog_BuildUI          ::tk::MotifFDialog_BuildUI
+       tkMotifFDialog_CancelCmd        ::tk::MotifFDialog_CancelCmd
+       tkMotifFDialog_Config           ::tk::MotifFDialog_Config
+       tkMotifFDialog_Create           ::tk::MotifFDialog_Create
+       tkMotifFDialog_FileTypes        ::tk::MotifFDialog_FileTypes
+       tkMotifFDialog_FilterCmd        ::tk::MotifFDialog_FilterCmd
+       tkMotifFDialog_InterpFilter     ::tk::MotifFDialog_InterpFilter
+       tkMotifFDialog_LoadFiles        ::tk::MotifFDialog_LoadFiles
+       tkMotifFDialog_MakeSList        ::tk::MotifFDialog_MakeSList
+       tkMotifFDialog_OkCmd            ::tk::MotifFDialog_OkCmd
+       tkMotifFDialog_SetFilter        ::tk::MotifFDialog_SetFilter
+       tkMotifFDialog_SetListMode      ::tk::MotifFDialog_SetListMode
+       tkMotifFDialog_Update           ::tk::MotifFDialog_Update
+       tkPostOverPoint                 ::tk::PostOverPoint
+       tkRecolorTree                   ::tk::RecolorTree
+       tkRestoreOldGrab                ::tk::RestoreOldGrab
+       tkSaveGrabInfo                  ::tk::SaveGrabInfo
+       tkScaleActivate                 ::tk::ScaleActivate
+       tkScaleButtonDown               ::tk::ScaleButtonDown
+       tkScaleButton2Down              ::tk::ScaleButton2Down
+       tkScaleControlPress             ::tk::ScaleControlPress
+       tkScaleDrag                     ::tk::ScaleDrag
+       tkScaleEndDrag                  ::tk::ScaleEndDrag
+       tkScaleIncrement                ::tk::ScaleIncrement
+       tkScreenChanged                 ::tk::ScreenChanged
+       tkScrollButtonDown              ::tk::ScrollButtonDown
+       tkScrollButton2Down             ::tk::ScrollButton2Down
+       tkScrollButtonDrag              ::tk::ScrollButtonDrag
+       tkScrollButtonUp                ::tk::ScrollButtonUp
+       tkScrollByPages                 ::tk::ScrollByPages
+       tkScrollByUnits                 ::tk::ScrollByUnits
+       tkScrollEndDrag                 ::tk::ScrollEndDrag
+       tkScrollSelect                  ::tk::ScrollSelect
+       tkScrollStartDrag               ::tk::ScrollStartDrag
+       tkScrollTopBottom               ::tk::ScrollTopBottom
+       tkScrollToPos                   ::tk::ScrollToPos
+       tkTabToWindow                   ::tk::TabToWindow
+       tkTearOffMenu                   ::tk::TearOffMenu
+       tkTextAutoScan                  ::tk::TextAutoScan
+       tkTextButton1                   ::tk::TextButton1
+       tkTextClosestGap                ::tk::TextClosestGap
+       tkTextInsert                    ::tk::TextInsert
+       tkTextKeyExtend                 ::tk::TextKeyExtend
+       tkTextKeySelect                 ::tk::TextKeySelect
+       tkTextNextPara                  ::tk::TextNextPara
+       tkTextNextPos                   ::tk::TextNextPos
+       tkTextNextWord                  ::tk::TextNextWord
+       tkTextPaste                     ::tk::TextPaste
+       tkTextPrevPara                  ::tk::TextPrevPara
+       tkTextPrevPos                   ::tk::TextPrevPos
+       tkTextPrevWord                  ::tk::TextPrevWord
+       tkTextResetAnchor               ::tk::TextResetAnchor
+       tkTextScrollPages               ::tk::TextScrollPages
+       tkTextSelectTo                  ::tk::TextSelectTo
+       tkTextSetCursor                 ::tk::TextSetCursor
+       tkTextTranspose                 ::tk::TextTranspose
+       tkTextUpDownLine                ::tk::TextUpDownLine
+       tkTraverseToMenu                ::tk::TraverseToMenu
+       tkTraverseWithinMenu            ::tk::TraverseWithinMenu
+     }
+     variable PrivateVariables
+     array set PrivateVariables {
+       histNum                 ::tk::histNum
+       tk_textRedraw           ::tk::textRedraw
+       tk_textRelayout         ::tk::textRelayout
+       tkFocusIn               ::tk::FocusIn
+       tkFocusOut              ::tk::FocusOut
+       tkPalette               ::tk::Palette
+       tkPriv                  ::tk::Priv
+       tkPrivMsgBox            ::tk::PrivMsgBox
+     }
+ }
+ proc ::tk::unsupported::ExposePrivateCommand {cmd} {
+     variable PrivateCommands
+     if {![info exists PrivateCommands($cmd)]} {
+       return -code error "No compatibility support for \[$cmd]"
+     }
+     namespace eval :: [list interp alias {} $cmd {}] $PrivateCommands($cmd)
+ }
+ proc ::tk::unsupported::ExposePrivateVariable {var} {
+     variable PrivateVariables
+     if {![info exists PrivateVariables($var)]} {
+       return -code error "No compatibility support for \$$var"
+     }
+     namespace eval :: [list upvar #0 $PrivateVariables($var) $var]
+ }


    This patch adds the compatibility
    interface to the file tk.tcl.  It
    might be better to add a completely
    new file, unsupported.tcl, to
    tk/library/ for things like this,
    but it did not seem appropriate to 
    do that in a patch.

dkf added on 2000-11-19 20:05:53:
We should do this; it may be a whopper change, but since it should only ever affect code that was grubbing around where it shouldn't have been (we always said that the functions were private) so doing it without loads of prior warnings will be OK from a process PoV.  It would also help a lot with cleaning up the command-load of Tk, which is rather heavy right now.  (I find it difficult to find out what commands I've created when debugging due to the sheer quantity of Tk internal procs lying around in the global namespace.)

We might wish to do this in an alpha and see what code it breaks in practise so we can figure out which procedures that are currently private really ought to be documented and put into the public API...