1#!/bin/sh 2# the next line restarts using wish \ 3exec wish "$0" ${1+"$@"} 4 5# ixset -- 6# A nice interface to "xset" to change X server settings 7# 8# History : 9# 91/11/23 : pda@masi.ibp.fr, jt@ratp.fr : design 10# 92/08/01 : pda@masi.ibp.fr : cleaning 11# 12# RCS: @(#) $Id$ 13 14package require Tcl 8.4 15package require Tk 16 17# 18# Button actions 19# 20 21proc quit {} { 22 destroy . 23} 24 25proc ok {} { 26 writesettings 27 quit 28} 29 30proc cancel {} { 31 readsettings 32 dispsettings 33 .buttons.apply configure -state disabled 34 .buttons.cancel configure -state disabled 35} 36 37proc apply {} { 38 writesettings 39 .buttons.apply configure -state disabled 40 .buttons.cancel configure -state disabled 41} 42 43# 44# Read current settings 45# 46 47proc readsettings {} { 48 global kbdrep ; set kbdrep "on" 49 global kbdcli ; set kbdcli 0 50 global bellvol ; set bellvol 100 51 global bellpit ; set bellpit 440 52 global belldur ; set belldur 100 53 global mouseacc ; set mouseacc "3/1" 54 global mousethr ; set mousethr 4 55 global screenbla ; set screenbla "blank" 56 global screentim ; set screentim 600 57 global screencyc ; set screencyc 600 58 59 set xfd [open "|xset q" r] 60 while {[gets $xfd line] > -1} { 61 switch -- [lindex $line 0] { 62 auto { 63 set rpt [lindex $line 1] 64 if {$rpt eq "repeat:"} { 65 set kbdrep [lindex $line 2] 66 set kbdcli [lindex $line 6] 67 } 68 } 69 bell { 70 set bellvol [lindex $line 2] 71 set bellpit [lindex $line 5] 72 set belldur [lindex $line 8] 73 } 74 acceleration: { 75 set mouseacc [lindex $line 1] 76 set mousethr [lindex $line 3] 77 } 78 prefer { 79 set bla [lindex $line 2] 80 set screenbla [expr {$bla eq "yes" ? "blank" : "noblank"}] 81 } 82 timeout: { 83 set screentim [lindex $line 1] 84 set screencyc [lindex $line 3] 85 } 86 } 87 } 88 close $xfd 89 90 # puts stdout [format "Key REPEAT = %s\n" $kbdrep] 91 # puts stdout [format "Key CLICK = %s\n" $kbdcli] 92 # puts stdout [format "Bell VOLUME = %s\n" $bellvol] 93 # puts stdout [format "Bell PITCH = %s\n" $bellpit] 94 # puts stdout [format "Bell DURATION = %s\n" $belldur] 95 # puts stdout [format "Mouse ACCELERATION = %s\n" $mouseacc] 96 # puts stdout [format "Mouse THRESHOLD = %s\n" $mousethr] 97 # puts stdout [format "Screen BLANCK = %s\n" $screenbla] 98 # puts stdout [format "Screen TIMEOUT = %s\n" $screentim] 99 # puts stdout [format "Screen CYCLE = %s\n" $screencyc] 100} 101 102 103# 104# Write settings into the X server 105# 106 107proc writesettings {} { 108 global kbdrep kbdcli bellvol bellpit belldur 109 global mouseacc mousethr screenbla screentim screencyc 110 111 set bellvol [.bell.vol get] 112 set bellpit [.bell.val.pit.entry get] 113 set belldur [.bell.val.dur.entry get] 114 115 if {$kbdrep eq "on"} { 116 set kbdcli [.kbd.val.cli get] 117 } else { 118 set kbdcli "off" 119 } 120 121 set mouseacc [.mouse.hor.acc.entry get] 122 set mousethr [.mouse.hor.thr.entry get] 123 124 set screentim [.screen.tim.entry get] 125 set screencyc [.screen.cyc.entry get] 126 127 exec xset \ 128 b $bellvol $bellpit $belldur \ 129 c $kbdcli \ 130 r $kbdrep \ 131 m $mouseacc $mousethr \ 132 s $screentim $screencyc \ 133 s $screenbla 134} 135 136 137# 138# Sends all settings to the window 139# 140 141proc dispsettings {} { 142 global kbdrep kbdcli bellvol bellpit belldur 143 global mouseacc mousethr screenbla screentim screencyc 144 145 .bell.vol set $bellvol 146 .bell.val.pit.entry delete 0 end 147 .bell.val.pit.entry insert 0 $bellpit 148 .bell.val.dur.entry delete 0 end 149 .bell.val.dur.entry insert 0 $belldur 150 151 .kbd.val.onoff [expr {$kbdrep eq "on" ? "select" : "deselect"}] 152 .kbd.val.cli set $kbdcli 153 154 .mouse.hor.acc.entry delete 0 end 155 .mouse.hor.acc.entry insert 0 $mouseacc 156 .mouse.hor.thr.entry delete 0 end 157 .mouse.hor.thr.entry insert 0 $mousethr 158 159 .screen.blank [expr {$screenbla eq "blank" ? "select" : "deselect"}] 160 .screen.pat [expr {$screenbla ne "blank" ? "select" : "deselect"}] 161 .screen.tim.entry delete 0 end 162 .screen.tim.entry insert 0 $screentim 163 .screen.cyc.entry delete 0 end 164 .screen.cyc.entry insert 0 $screencyc 165} 166 167 168# 169# Create all windows, and pack them 170# 171 172proc labelentry {path text length {range {}}} { 173 frame $path 174 label $path.label -text $text 175 if {[llength $range]} { 176 spinbox $path.entry -width $length -relief sunken \ 177 -from [lindex $range 0] -to [lindex $range 1] 178 } else { 179 entry $path.entry -width $length -relief sunken 180 } 181 pack $path.label -side left 182 pack $path.entry -side right -expand y -fill x 183} 184 185proc createwindows {} { 186 # 187 # Buttons 188 # 189 190 frame .buttons 191 button .buttons.ok -default active -command ok -text "Ok" 192 button .buttons.apply -default normal -command apply -text "Apply" \ 193 -state disabled 194 button .buttons.cancel -default normal -command cancel -text "Cancel" \ 195 -state disabled 196 button .buttons.quit -default normal -command quit -text "Quit" 197 198 pack .buttons.ok .buttons.apply .buttons.cancel .buttons.quit \ 199 -side left -expand yes -pady 5 200 201 bind . <Return> {.buttons.ok flash; .buttons.ok invoke} 202 bind . <Escape> {.buttons.quit flash; .buttons.quit invoke} 203 bind . <1> { 204 if {![string match .buttons* %W]} { 205 .buttons.apply configure -state normal 206 .buttons.cancel configure -state normal 207 } 208 } 209 bind . <Key> { 210 if {![string match .buttons* %W]} { 211 switch -glob %K { 212 Return - Escape - Tab - *Shift* {} 213 default { 214 .buttons.apply configure -state normal 215 .buttons.cancel configure -state normal 216 } 217 } 218 } 219 } 220 221 # 222 # Bell settings 223 # 224 225 labelframe .bell -text "Bell Settings" -padx 1.5m -pady 1.5m 226 scale .bell.vol \ 227 -from 0 -to 100 -length 200 -tickinterval 20 \ 228 -label "Volume (%)" -orient horizontal 229 230 frame .bell.val 231 labelentry .bell.val.pit "Pitch (Hz)" 6 {25 20000} 232 labelentry .bell.val.dur "Duration (ms)" 6 {1 10000} 233 pack .bell.val.pit -side left -padx 5 234 pack .bell.val.dur -side right -padx 5 235 pack .bell.vol .bell.val -side top -expand yes 236 237 # 238 # Keyboard settings 239 # 240 241 labelframe .kbd -text "Keyboard Repeat Settings" -padx 1.5m -pady 1.5m 242 243 frame .kbd.val 244 checkbutton .kbd.val.onoff \ 245 -text "On" \ 246 -onvalue "on" -offvalue "off" -variable kbdrep \ 247 -relief flat 248 scale .kbd.val.cli \ 249 -from 0 -to 100 -length 200 -tickinterval 20 \ 250 -label "Click Volume (%)" -orient horizontal 251 pack .kbd.val.onoff -side left -fill x -expand yes -padx {0 1m} 252 pack .kbd.val.cli -side left -expand yes -fill x -padx {1m 0} 253 254 pack .kbd.val -side top -expand yes -pady 2 -fill x 255 256 # 257 # Mouse settings 258 # 259 260 labelframe .mouse -text "Mouse Settings" -padx 1.5m -pady 1.5m 261 262 frame .mouse.hor 263 labelentry .mouse.hor.acc "Acceleration" 5 264 labelentry .mouse.hor.thr "Threshold (pixels)" 3 {1 2000} 265 266 pack .mouse.hor.acc -side left -padx {0 1m} 267 pack .mouse.hor.thr -side right -padx {1m 0} 268 269 pack .mouse.hor -side top -expand yes 270 271 # 272 # Screen Saver settings 273 # 274 275 labelframe .screen -text "Screen-saver Settings" -padx 1.5m -pady 1.5m 276 277 radiobutton .screen.blank \ 278 -variable screenblank -text "Blank" -relief flat \ 279 -value "blank" -variable screenbla -anchor w 280 radiobutton .screen.pat \ 281 -variable screenblank -text "Pattern" -relief flat \ 282 -value "noblank" -variable screenbla -anchor w 283 labelentry .screen.tim "Timeout (s)" 5 {1 100000} 284 labelentry .screen.cyc "Cycle (s)" 5 {1 100000} 285 286 grid .screen.blank .screen.tim -sticky e 287 grid .screen.pat .screen.cyc -sticky e 288 grid configure .screen.blank .screen.pat -sticky ew 289 290 # 291 # Main window 292 # 293 294 pack .buttons -side top -fill both 295 pack .bell .kbd .mouse .screen -side top -fill both -expand yes \ 296 -padx 1m -pady 1m 297 298 # 299 # Let the user resize our window 300 # 301 wm minsize . 10 10 302} 303 304############################################################################## 305# Main program 306 307# 308# Listen what "xset" tells us... 309# 310 311readsettings 312 313# 314# Create all windows 315# 316 317createwindows 318 319# 320# Write xset parameters 321# 322 323dispsettings 324 325# 326# Now, wait for user actions... 327# 328 329# Local Variables: 330# mode: tcl 331# End: 332