set.config desktop_background_color blue should result in: set i 0 while {[winfo exists [set win .desktop$i]]} { $win config -bg blue incr i } Now let's solve the problem of set.config display_desktop_label 1 If it goes from 1 to 0 we need this: set i 0 while {[winfo exists [set win .desktop$i]]} { $win delete _whim_desktop_label incr i } If it goes from 0 to 1 we need this: set i 0 while {[winfo exists [set win .desktop$i]]} { set font {-*-clean-*-*-*-*-17-*-*-*-*-*-*-*} array set fontinfo [font metrics $font] $desktop create text \ [expr {[winfo screenwidth .] / 2}] [expr {$fontinfo(-linespace) / 2}] \ -text "Desktop:$name" -font $font -fill yellow incr i } We could have a foreach.desktop proc that iterates the desktops. We should not run the code if state changes from 0 to 0, or 1 to 1. In fact if the state doesn't change from whatever present value it has we shouldn't run the code. set.config autoshade_controls 1 This is a little tricky. We really need a "set" callback to handle various values, and dispatch. set.config give_focus_to_new_windows 0|1 this doesn't require any callback. set.config inactive_titlebar_background color This could be a little slow. We have to do this essentially: global desktops global windows foreach.desktop d { foreach win $desktops($d,windows) { set path $windows($win,path) $path.titlebar config -bg $whatever $path.titlebar.title config -bg $whatever } } set.config desktops [list foo bar baz bat] This is problematic, because we should probably destroy all of the existing desktops. I'd rather just allow appending a desktop or destroying an individual desktop. set.config focus_follows_mouse 0|1 no need for a complex callback So we really should declare some configuration options with "NEED_CALLBACK" We have another problem too. What if the user changes use_tile at runtime? This means we will need to use the former widgets. Should we allow this?