2005-01-10 Andrew Stubbs * library/mempref.itb (MemPref::constructor): Allow the Byte Per Row combo box to accept arbitrary values. (MemPref::set_bytes_per_row): Validate the new value; reject invalid entries and round up to a multiple of the word size. (MemPref::apply): Read the value from the text box even if the user has not pressed return. (MemPref::enable_format): Ensure the bytes per row value is still valid. (MemPref::disable_format): Likewise. * library/mempref.ith (MemPref): Add $gbprlist. * library/help/memory.html: Update. Index: src/gdb/gdbtk/library/mempref.itb =================================================================== --- src.orig/gdb/gdbtk/library/mempref.itb 2006-01-10 14:59:39.000000000 +0000 +++ src/gdb/gdbtk/library/mempref.itb 2006-01-10 15:19:54.000000000 +0000 @@ -41,6 +41,7 @@ itcl::body MemPref::constructor {args} { set gnumbytes $numbytes set gbpr $bpr + set gbprlist [list 4 8 16 32 64 128] set gascii $ascii set gascii_char $ascii_char @@ -153,14 +154,11 @@ itcl::body MemPref::build_win {} { label $fr.2.l -text "Bytes Per Row " set Widgets(b-bytes_per_row) [::combobox::combobox $fr.2.c \ -command [code $this set_bytes_per_row] \ - -width 4 -editable 0 -font global/fixed \ + -width 4 -editable 1 -font global/fixed \ -bg $::Colors(textbg)] - $fr.2.c list insert end 4 - $fr.2.c list insert end 8 - $fr.2.c list insert end 16 - $fr.2.c list insert end 32 - $fr.2.c list insert end 64 - $fr.2.c list insert end 128 + foreach item $gbprlist { + $fr.2.c list insert end $item + } $fr.2.c configure -value $gbpr pack $fr.2.l -side left -anchor e @@ -264,7 +262,40 @@ itcl::body MemPref::check_numbytes {var # METHOD: set_bytes_per_row - combobox callback to set the bytes per row # ------------------------------------------------------------------ itcl::body MemPref::set_bytes_per_row {w value} { - set gbpr $value + if {[string is integer -strict $value] && [expr {$value != 0}]} { + # The input is a value number. + set gbpr $value + set gbpr [string trim $gbpr] + + # Too high a number will cause a Segmentation fault. + if {[expr {$gbpr > 150}]} {set gbpr 150} + + # Insert the value into the combo box list, if it isn't there already. + set found 0 + foreach item $gbprlist { + if {$item == $gbpr} { + set found 1 + } + } + if {[expr {$found == 0}]} { + lappend gbprlist $gbpr + $Widgets(b-bytes_per_row) list insert end $gbpr + } + + set s $gsize + if {[expr {$s == 3}]} {set s 4} + if {[expr {$s == 5}]} {set s 8} + set rem [expr {$gbpr % $s}] + if {[expr {$rem != 0}]} { + # The bytes-per-row is not a multiple of the size. + set gbpr [expr {$gbpr + ($s - $rem)}] + } + } + + # Set the display to the new value. This may be different if the input + # was zero or not a number, or if the user entered any whitespace. + $Widgets(b-bytes_per_row) delete 0 end + $Widgets(b-bytes_per_row) insert end $gbpr } # ------------------------------------------------------------------ @@ -318,6 +349,9 @@ itcl::body MemPref::apply {} { } } + # Ensure the value has been read from the text field. + set_bytes_per_row "" [$Widgets(b-bytes_per_row) get] + # pass all the changed values back to parent debug "$win configChange -size $size -numbytes $numbytes \ -format $format -ascii $gascii \ @@ -338,6 +372,10 @@ itcl::body MemPref::apply {} { # METHOD: enable_format - turn on the format radio buttons # ------------------------------------------------------------------ itcl::body MemPref::enable_format {} { + # First ensure bytes per row is a multiple of the size. + # Use the value of the widget, not $gbpr to ensure the typed value is kept. + set_bytes_per_row "" [$Widgets(b-bytes_per_row) get] + if {!$format_disabled} { return } @@ -353,6 +391,10 @@ itcl::body MemPref::enable_format {} { # METHOD: disable_format - turn off the format radio buttons # ------------------------------------------------------------------ itcl::body MemPref::disable_format {} { + # First ensure bytes per row is a multiple of the size. + # Use the value of the widget, not $gbpr to ensure the typed value is kept. + set_bytes_per_row "" [$Widgets(b-bytes_per_row) get] + if {$format_disabled} { return } Index: src/gdb/gdbtk/library/mempref.ith =================================================================== --- src.orig/gdb/gdbtk/library/mempref.ith 2006-01-10 14:59:39.000000000 +0000 +++ src/gdb/gdbtk/library/mempref.ith 2006-01-10 15:19:54.000000000 +0000 @@ -47,6 +47,7 @@ itcl::class MemPref { variable gformat variable gnumbytes variable gbpr + variable gbprlist variable gascii variable gascii_char variable gvar Index: src/gdb/gdbtk/library/help/memory.html =================================================================== --- src.orig/gdb/gdbtk/library/help/memory.html 2006-01-10 15:48:34.000000000 +0000 +++ src/gdb/gdbtk/library/help/memory.html 2006-01-10 15:26:08.000000000 +0000 @@ -232,7 +232,9 @@ of bytes. By default, the Memory Window Miscellaneous memory preferences include the option to display the ASCII representation of the memory, including what character to use for non-ASCII bytes (the "control" character). Additionally, users may specify the number -of bytes per row, either four, eight, sixteen, or thirty-two. The default -is sixteen bytes per row. +of bytes per row, either by typing a number into the box or by choosing one +from the list. The default is sixteen bytes per row. If the entered value is +not a multiple of the cell size then it will be automatically rounded up. The +maximum permitted value is 150 (before rounding).