#!/bin/sh
# Copyright (C) 2000-2002 Daniel Linder / UIUC DRES
# Next line is a comment to Tcl \
exec wish -f "$0" ${1+"$@"}
# Begin Tcl/Tk Code

proc InitAX {} {
    wm resizable . 0 0

    # Set up Frames

    frame .stickykeys -borderwidth 1 -relief sunken
    pack .stickykeys -side top -fill x

    frame .mousekeys -borderwidth 1 -relief sunken
    pack .mousekeys -side top -fill x

    frame .bouncekeys -borderwidth 1 -relief sunken
    pack .bouncekeys -side top -fill x

    frame .slowkeys -borderwidth 1 -relief sunken
    pack .slowkeys -side top -fill x

    frame .repeatkeys -borderwidth 1 -relief sunken
    pack .repeatkeys -side top -fill x

    frame .timeout -borderwidth 1 -relief sunken
    pack .timeout -side top -fill x

    frame .general -borderwidth 1 -relief sunken
    pack .general -side top -fill x

    # Place Widgets

    # StickyKeys

    checkbutton .stickykeys.toggle -text StickyKeys \
	-variable stickykeysenabled
    pack .stickykeys.toggle -side left

    checkbutton .stickykeys.modsound \
	-text {StickyKeys Mod Sound} \
	-variable stickykeysmodsound
    pack .stickykeys.modsound -side right

    checkbutton .stickykeys.twokeydisable \
	-text {StickyKeys Two Key Disable} \
	-variable stickykeystwokeydisable
    pack .stickykeys.twokeydisable -side right

    # MouseKeys

    checkbutton .mousekeys.toggle -text MouseKeys \
	-variable mousekeysenabled
    pack .mousekeys.toggle -side left

    scale .mousekeys.maxspeed -from 10 -to 1000 -length 300 \
	-variable mkmaxspeed -orient horizontal \
	-label "MouseKeys Max Speed (pixels per second)" \
	-tickinterval 200 -showvalue true
    pack .mousekeys.maxspeed

    scale .mousekeys.timetomax -from 1 -to 4 -length 300 \
	-variable mktimetomax -orient horizontal -showvalue true \
	-label "MouseKeys Time To Max (sec)" -tickinterval 1
    pack .mousekeys.timetomax

    # BounceKeys

    checkbutton .bouncekeys.toggle -text BounceKeys \
	-variable bouncekeysenabled
    pack .bouncekeys.toggle -side left

    scale .bouncekeys.delay -from 0.1 -to 5.0 -length 300 \
	-variable bkdebounce -orient horizontal \
	-label "BounceKeys Debounce Delay (sec)" -tickinterval 1.0 \
	-showvalue true -resolution 0.1
    pack .bouncekeys.delay

    # SlowKeys

    checkbutton .slowkeys.toggle -text SlowKeys \
	-variable slowkeysenabled
    pack .slowkeys.toggle -side left

    scale .slowkeys.delay -from 0.1 -to 5.0 -length 300 \
	-variable slowkeysdelay -orient horizontal \
	-label "SlowKeys Delay (sec)" \
	-tickinterval 1.0 -resolution 0.1 -showvalue true
    pack .slowkeys.delay

    # RepeatKeys

    checkbutton .repeatkeys.toggle -text RepeatKeys \
	-variable repeatkeysenabled
    pack .repeatkeys.toggle -side left

    scale .repeatkeys.delay -from 0.1 -to 10.0 -length 300 -variable rkdelay \
	-orient horizontal -label "RepeatKeys Delay (sec)" \
	-tickinterval 1.0 -resolution 0.1 -showvalue true
    pack .repeatkeys.delay

    scale .repeatkeys.rate -from 0.1 -to 10.0 -length 300 -variable rkrate \
	-orient horizontal -label "RepeatKeys Rate (keys per sec)" \
	-tickinterval 1.0 -resolution 0.1 -showvalue true
    pack .repeatkeys.rate

    # TimeOut

    checkbutton .timeout.toggle -text TimeOut \
	-variable timeoutenabled
    pack .timeout.toggle -side left

    scale .timeout.delay -from 1 -to 10 -length 300 -variable todelay \
	-orient horizontal -label "AccessX Timeout Delay (minutes)" \
	-tickinterval 1 -showvalue true
    pack .timeout.delay

    # General Controls

    button .general.cancel -text {Exit} \
	-command exit
    pack .general.cancel -side right

    button .general.getxserv -text {Undo} \
	-command ReadXServValues
    pack .general.getxserv -side right

    button .general.save -text {Save} \
	-command WriteAndUse
    pack .general.save -side right

    # End
}

proc ReadXServValues {} {

    global timeoutenabled todelay mousekeysenabled mktimetomax mkmaxspeed \
	slowkeysenabled slowkeysdelay stickykeysenabled stickykeysmodsound \
	stickykeystwokeydisable bouncekeysenabled bkdebounce \
	repeatkeysenabled rkdelay rkrate togglekeysenabled soundonoffenabled \
	slowkeysonacceptenabled slowkeysonpressenabled enableaccessxenabled

    #Need Environment Vars for Home Directory
    global env

    set fname [file join $env(HOME) AccessX]

    if [file exists $fname] {
       set theinput [exec ax loadconfig showraw]

       scan $theinput \
         "%d\n%d\n%d\n%d\n%d\n%d\n%f\n%d\n%d\n%d\n%d\n%f\n%d\n%f\n%f\n%d\n%d\n%d\n%d\n%d\n" \
	timeoutenabled todelay mousekeysenabled mktimetomax mkmaxspeed \
	slowkeysenabled slowkeysdelay stickykeysenabled stickykeysmodsound \
	stickykeystwokeydisable bouncekeysenabled bkdebounce \
	repeatkeysenabled rkdelay rkrate togglekeysenabled soundonoffenabled \
	slowkeysonacceptenabled slowkeysonpressenabled enableaccessxenabled
    } else {
       set theinput [exec ax showraw]

       scan $theinput \
         "%d\n%d\n%d\n%d\n%d\n%d\n%f\n%d\n%d\n%d\n%d\n%f\n%d\n%f\n%f\n%d\n%d\n%d\n%d\n%d\n" \
	timeoutenabled todelay mousekeysenabled mktimetomax mkmaxspeed \
	slowkeysenabled slowkeysdelay stickykeysenabled stickykeysmodsound \
	stickykeystwokeydisable bouncekeysenabled bkdebounce \
	repeatkeysenabled rkdelay rkrate togglekeysenabled soundonoffenabled \
	slowkeysonacceptenabled slowkeysonpressenabled enableaccessxenabled
    }
}

proc GetFileValues {} {
    #Need Environment Vars for Home Directory
    global env

    set fname [file join $env(HOME) AccessX]

    if [file exists $fname] {
	set yay 1
    } else {
	puts stdout "Config file not found."
    }

    set newval [exec ax loadconfig]
    ReadXServValues
}

proc WriteToFile {} {
    global timeoutenabled todelay mousekeysenabled mktimetomax mkmaxspeed \
	slowkeysenabled slowkeysdelay stickykeysenabled stickykeysmodsound \
	stickykeystwokeydisable bouncekeysenabled bkdebounce \
	repeatkeysenabled rkdelay rkrate togglekeysenabled soundonoffenabled \
	slowkeysonacceptenabled slowkeysonpressenabled enableaccessxenabled

    #Need Environment Vars for Home Directory
    global env

    set fname [file join $env(HOME) AccessX]

    set fid [open $fname w]

    puts -nonewline $fid [format "*StickyTwoKeysToggle.set:\t"]
    if $stickykeystwokeydisable {
	puts $fid "True"
    } else {
	puts $fid "False"
    }

    puts -nonewline $fid [format "*ToggleKeysToggle.set:\t"]
    if $togglekeysenabled {
	puts $fid "True"
    } else {
	puts $fid "False"
    }

    puts -nonewline $fid [format "*StickyModSoundToggle.set:\t"]
    if $stickykeysmodsound {
	puts $fid "True"
    } else {
	puts $fid "False"
    }

    puts -nonewline $fid [format "*SlowKeysToggle.set:\t"]
    if $slowkeysenabled {
	puts $fid "True"
    } else {
	puts $fid "False"
    }

    puts $fid [format "*TimeOutScale.value:\t%d" $todelay]
    puts $fid [format "*TimeOutScale.decimalPoints:\t0"]

    set skd [expr {int($slowkeysdelay * 1000)}]
    puts $fid [format "*KRGSlowKeysDelayScale.value:\t%d" $skd]
    puts $fid [format "*KRGSlowKeysDelayScale.decimalPoints:\t3"]

    puts $fid [format "*MouseMaxSpeedScale.value:\t%d" $mkmaxspeed]
    puts $fid [format "*MouseMaxSpeedScale.decimalPoints:\t0"]

    puts -nonewline $fid [format "*SoundOnOffToggle.set:\t"]
    if $soundonoffenabled {
	puts $fid "True"
    } else {
	puts $fid "False"
    }

    set bkd [expr {int($bkdebounce * 1000)}]
    puts $fid [format "*KRGDebounceScale.value:\t%d" $bkd]
    puts $fid [format "*KRGDebounceScale.decimalPoints:\t3"]

    puts -nonewline $fid [format "*SlowKeysOnAcceptToggle.set:\t"]
    if $slowkeysonacceptenabled {
	puts $fid "True"
    } else {
	puts $fid "False"
    }

    puts -nonewline $fid [format "*TimeOutToggle.set:\t"]
    if $timeoutenabled {
	puts $fid "True"
    } else {
	puts $fid "False"
    }

    puts -nonewline $fid [format "*SlowKeysOnPressToggle.set:\t"]
    if $slowkeysonpressenabled {
	puts $fid "True"
    } else {
	puts $fid "False"
    }

    puts -nonewline $fid [format "*EnableAccessXToggle.set:\t"]
    if $enableaccessxenabled {
	puts $fid "True"
    } else {
	puts $fid "False"
    }

    puts -nonewline $fid [format "*RepeatKeysToggle.set:\t"]
    if $repeatkeysenabled {
	puts $fid "True"
    } else {
	puts $fid "False"
    }

    puts -nonewline $fid [format "*BounceKeysToggle.set:\t"]
    if $bouncekeysenabled {
	puts $fid "True"
    } else {
	puts $fid "False"
    }

    set rkd [expr {int($rkdelay * 1000)}]
    puts $fid [format "*KRGRepeatDelayScale.value:\t%d" $rkd]
    puts $fid [format "*KRGRepeatDelayScale.decimalPoints:\t3"]

    set rkr [expr {int($rkrate * 10)}]
    puts $fid [format "*KRGRepeatRateScale.value:\t%d" $rkr]
    puts $fid [format "*KRGRepeatRateScale.decimalPoints:\t1"]

    set mkttm [expr {int($mktimetomax * 1000)}]
    puts $fid [format "*MouseTimeToMaxScale.value:\t%d" $mkttm]
    puts $fid [format "*MouseTimeToMaxScale.decimalPoints:\t3"]

    puts -nonewline $fid [format "*StickyKeysToggle.set:\t"]
    if $stickykeysenabled {
	puts $fid "True"
    } else {
	puts $fid "False"
    }

    puts -nonewline $fid [format "*MouseKeysToggle.set:\t"]
    if $mousekeysenabled {
	puts $fid "True"
    } else {
	puts $fid "False"
    }

    close $fid
}

proc WriteAndUse {} {
    WriteToFile
    exec ax loadconfig
}

# BEGIN MAIN PROGRAM

    InitAX

    ReadXServValues

# END MAIN PROGRAM


