This is the mail archive of the
insight@sourceware.cygnus.com
mailing list for the Insight project.
Re: RFA: Fixes to the Registers window
- To: Fernando Nasser <fnasser at cygnus dot com>, insight at sourceware dot cygnus dot com
- Subject: Re: RFA: Fixes to the Registers window
- From: Syd Polk <spolk at cygnus dot com>
- Date: Wed, 03 May 2000 10:45:34 -0700
This looks reasonable to me.
At 03:33 PM 5/2/00 -0400, Fernando Nasser wrote:
>This improves the overall appearance of the Registers window when there
>are registers with values that differ much in length. It also avoids a
>stack trace if a value is not accepted.
>
>The main improvement though is the ability to handle typed registers, as
>we now have for several new processors to which gdb has been ported. To
>make the user's life easier, an option to add registers to the Watch
>window (were typed register details can be seen and values edited) has
>been added.
>
>The ChangeLog entry tells the above in some more detailed terms.
>
>--
>Fernando Nasser
>Red Hat - Toronto E-Mail: fnasser@cygnus.com
>
>
>Index: ChangeLog
>===================================================================
>RCS file: /cvs/src/src/gdb/gdbtk/library/ChangeLog,v
>retrieving revision 1.18
>diff -c -p -r1.18 ChangeLog
>*** ChangeLog 2000/04/27 16:46:12 1.18
>--- ChangeLog 2000/05/02 19:24:23
>***************
>*** 1,3 ****
>--- 1,18 ----
>+ 2000-05-01 Fernando Nasser <fnasser@cygnus.com>
>+
>+ * regwin.itb (build_win): Adjust size of columns independently, force
>+ typed registers to raw mode and check if values can be edited.
>+ Also, add "Add to Watch" option to the menu.
>+ (update): Similar changes to similar code.
>+ (init_reg_display_vars): Initialize new variables used above.
>+ (reg_select): Deactivate menu options when action is not possible.
>+ (but3): Ditto.
>+ (edit): Do not edit if it is not editable.
>+ (acceptEdit): Fix bug is error message box display.
>+ (addToWatch): New mwthod. Add a register to the Watch window.
>+ * regwin.ith: Add addToWatch to the class.
>+ * tclIndex: Regenerate.
>+
> 2000-04-27 James Ingham <jingham@leda.cygnus.com>
>
> These changes allow Insight to handle the case where there are
>Index: regwin.itb
>===================================================================
>RCS file: /cvs/src/src/gdb/gdbtk/library/regwin.itb,v
>retrieving revision 1.4
>diff -c -p -r1.4 regwin.itb
>*** regwin.itb 2000/04/05 23:53:12 1.4
>--- regwin.itb 2000/05/02 19:24:23
>*************** body RegWin::build_win {} {
>*** 70,79 ****
> tixScrolledWindow $itk_interior.scrolled -scrollbar auto
> }
> set ScrolledWin [$itk_interior.scrolled subwidget window]
>- # Create labels
>- set row 0
>- set col 0
>
> set regMaxLen 0
> foreach r [gdb_regnames] {
> set l [string length $r]
>--- 70,77 ----
> tixScrolledWindow $itk_interior.scrolled -scrollbar auto
> }
> set ScrolledWin [$itk_interior.scrolled subwidget window]
>
>+ # Calculate the maximum length of a register name
> set regMaxLen 0
> foreach r [gdb_regnames] {
> set l [string length $r]
>*************** body RegWin::build_win {} {
>*** 82,100 ****
> }
> }
>
>! set vmax 0
> foreach r $reg_display_list {
>! if {[catch {gdb_fetch_registers $reg_display($r,format) $r}
>values($r)]} {
> set values($r) ""
> } else {
>! set values($r) [string trim $values($r) \ ]
> }
> set l [string length $values($r)]
>! if {$l > $vmax} {
>! set vmax $l
> }
> }
>
> foreach r $reg_display_list {
> if {$row == $nRows} {
> grid columnconfigure $ScrolledWin $col -weight 1
>--- 80,139 ----
> }
> }
>
>! # Calculate the minimum size for each column so that the register
>values fit.
>! set row 0
>! set col 0
> foreach r $reg_display_list {
>! if {$row == 0} {
>! # A minimum of 10 so the appearence is nice
>! set vmax($col) 10
>! }
>!
>! # Typed registers natural values start with a brace (escaped by a slash)
>! if {[catch {gdb_fetch_registers {} $r} valtest]} {
> set values($r) ""
>+ } else {
>+ if {[string index $valtest 1] == "\{"} {
>+ # If it is a typed register, we print it raw
>+ set format r
>+ set reg_display($r,format) r
>+ set reg_display($r,typed) 1
>+ } else {
>+ set format $reg_display($r,format)
>+ }
>+ if {[catch {gdb_fetch_registers $format $r} values($r)]} {
>+ set values($r) ""
>+ } else {
>+ set values($r) [string trim $values($r) \ ]
>+ }
>+ }
>+
>+ # Check if we can edit this value
>+ if {[catch {gdb_cmd "set \$$reg_display($r,name)=$valtest"} rst]} {
>+ set reg_display($r,editable) 0
> } else {
>! set reg_display($r,editable) 1
> }
>+ catch {gdb_fetch_registers {} $r} valtest2
>+ if {$valtest2 != $valtest} {
>+ tk_messageBox -icon error -type ok -message "Register value
>clobbered!" \
>+ -title "Internal Error" -parent [winfo toplevel $itk_interior]
>+ }
>+
> set l [string length $values($r)]
>! if {$l > $vmax($col)} {
>! set vmax($col) $l
> }
>+ incr row
>+ if {$row == $nRows} {
>+ set row 0
>+ incr col
>+ }
> }
>
>+ # Create labels
>+ set row 0
>+ set col 0
> foreach r $reg_display_list {
> if {$row == $nRows} {
> grid columnconfigure $ScrolledWin $col -weight 1
>*************** body RegWin::build_win {} {
>*** 114,120 ****
>
> label $ScrolledWin.$r.lbl -text [fixLength $reg_display($r,name)
> $regMaxLen left] \
> -relief solid -bd 1 -font src-font
>! label $ScrolledWin.$r.val -anchor e -text [fixLength $values($r)
>$vmax right] \
> -relief ridge -bd 1 -font src-font -bg $tixOption(input1_bg)
>
> grid $ScrolledWin.$r.lbl $ScrolledWin.$r.val -sticky nsew
>--- 153,159 ----
>
> label $ScrolledWin.$r.lbl -text [fixLength $reg_display($r,name)
> $regMaxLen left] \
> -relief solid -bd 1 -font src-font
>! label $ScrolledWin.$r.val -anchor e -text [fixLength $values($r)
>$vmax($col) right] \
> -relief ridge -bd 1 -font src-font -bg $tixOption(input1_bg)
>
> grid $ScrolledWin.$r.lbl $ScrolledWin.$r.val -sticky nsew
>*************** body RegWin::build_win {} {
>*** 158,163 ****
>--- 197,204 ----
> -command "$this update"
> $m add command -label "Remove from Display" -underline 0 -state
> disabled
> $m add separator
>+ $m add command -label "Add to Watch" -underline 7 -state disabled
>+ $m add separator
> $m add command -label "Display All Registers" -underline 0 -state
> disabled \
> -command "$this display_all"
> set disp_all_menu_item [$m index last]
>*************** body RegWin::init_reg_display_vars {args
>*** 190,195 ****
>--- 231,237 ----
> global reg_display max_regs
> set reg_display_list {}
> set regnames [gdb_regnames -numbers]
>+
> set i 1
> set x 0
> foreach r $regnames {
>*************** body RegWin::init_reg_display_vars {args
>*** 197,205 ****
>--- 239,256 ----
> set name [lindex $r 0]
> set rn [lindex $r 1]
> set reg_display($rn,name) $name
>+
>+ # All registers shall be considered editable
>+ # and non-typed until proved otherwise
>+ set reg_display($rn,typed) 0
>+ set reg_display($rn,editable) 0
>+
>+ # If user has no preference, show register in hex (if we can)
> set format [pref getd gdb/reg/$name-format]
> if {$format == ""} { set format x }
> set reg_display($rn,format) $format
>+
>+ # Check if the user prefers not to show this register
> if {$args != "" && [pref getd gdb/reg/$name] == "no"} {
> set all_regs_shown 0
> set reg_display($rn,line) 0
>*************** body RegWin::init_reg_display_vars {args
>*** 209,214 ****
>--- 260,266 ----
> incr i
> }
> }
>+
> set num_regs [expr {$i - 1}]
> set max_regs $x
> set reg_names_dirty 0
>*************** body RegWin::reg_select_left { } {
>*** 309,315 ****
> # PUBLIC METHOD: reg_select - select a register
> # ------------------------------------------------------------------
> body RegWin::reg_select { r } {
>! global tixOption
>
> if {$Running} { return }
> if {$selected != -1} {
>--- 361,367 ----
> # PUBLIC METHOD: reg_select - select a register
> # ------------------------------------------------------------------
> body RegWin::reg_select { r } {
>! global reg_display tixOption
>
> if {$Running} { return }
> if {$selected != -1} {
>*************** body RegWin::reg_select { r } {
>*** 336,350 ****
> $ScrolledWin.$r.lbl configure -fg $tixOption(select_fg) -bg
> $tixOption(select_bg)
> $ScrolledWin.$r.val configure -fg $tixOption(fg) -bg $tixOption(bg)
>
>! if {![pref get gdb/mode]} {
> $itk_interior.m.reg entryconfigure 0 -state normal -command "$this
> edit $r"
> }
> $itk_interior.m.reg entryconfigure 2 -state normal \
> -command "$this delete_from_display_list $r"
> for {set i 0} {$i < 6} {incr i} {
>! $itk_interior.m.reg.format entryconfigure $i -state normal \
> -variable reg_display($r,format)
> }
> focus -force $ScrolledWin.$r
> set selected $r
> }
>--- 388,410 ----
> $ScrolledWin.$r.lbl configure -fg $tixOption(select_fg) -bg
> $tixOption(select_bg)
> $ScrolledWin.$r.val configure -fg $tixOption(fg) -bg $tixOption(bg)
>
>! if {![pref get gdb/mode] && $reg_display($r,editable)} {
> $itk_interior.m.reg entryconfigure 0 -state normal -command "$this
> edit $r"
> }
> $itk_interior.m.reg entryconfigure 2 -state normal \
> -command "$this delete_from_display_list $r"
>+ if {$reg_display($r,typed)} {
>+ set state disabled
>+ } else {
>+ set state normal
>+ }
> for {set i 0} {$i < 6} {incr i} {
>! debug "RegWin format $i $state"
>! $itk_interior.m.reg.format entryconfigure $i -state $state \
> -variable reg_display($r,format)
> }
>+ $itk_interior.m.reg entryconfigure 4 -state normal \
>+ -command "$this addToWatch $r"
> focus -force $ScrolledWin.$r
> set selected $r
> }
>*************** body RegWin::but3 {rn X Y} {
>*** 407,424 ****
> $Menu delete 0 end
> $Menu add command -label $reg_display($rn,name) -state disabled
> $Menu add separator
>! $Menu add radio -label "Hex" -command "$this update" \
>! -value x -variable reg_display($rn,format)
>! $Menu add radio -label "Decimal" -command "$this update" \
>! -value d -variable reg_display($rn,format)
>! $Menu add radio -label "Natural" -command "$this update" \
>! -value {} -variable reg_display($rn,format)
>! $Menu add radio -label "Binary" -command "$this update" \
>! -value t -variable reg_display($rn,format) -underline 0
>! $Menu add radio -label "Octal" -command "$this update" \
>! -value o -variable reg_display($rn,format)
>! $Menu add radio -label "Raw" -command "$this update" \
>! -value r -variable reg_display($rn,format)
> $Menu add separator
> $Menu add command -command "$this delete_from_display_list $rn" \
> -label "Remove $reg_display($rn,name) from Display"
>--- 467,489 ----
> $Menu delete 0 end
> $Menu add command -label $reg_display($rn,name) -state disabled
> $Menu add separator
>! if {!$reg_display($rn,typed)} {
>! $Menu add radio -label "Hex" -command "$this update" \
>! -value x -variable reg_display($rn,format)
>! $Menu add radio -label "Decimal" -command "$this update" \
>! -value d -variable reg_display($rn,format)
>! $Menu add radio -label "Natural" -command "$this update" \
>! -value {} -variable reg_display($rn,format)
>! $Menu add radio -label "Binary" -command "$this update" \
>! -value t -variable reg_display($rn,format) -underline 0
>! $Menu add radio -label "Octal" -command "$this update" \
>! -value o -variable reg_display($rn,format)
>! $Menu add radio -label "Raw" -command "$this update" \
>! -value r -variable reg_display($rn,format)
>! $Menu add separator
>! }
>! $Menu add command -command "$this addToWatch $rn" \
>! -label "Add $reg_display($rn,name) to Watch"
> $Menu add separator
> $Menu add command -command "$this delete_from_display_list $rn" \
> -label "Remove $reg_display($rn,name) from Display"
>*************** body RegWin::delete_from_display_list {r
>*** 461,467 ****
> }
> set num_regs $i
> reconfig
>! $itk_interior.m.reg entryconfigure 4 -state normal
> }
>
>
>--- 526,532 ----
> }
> set num_regs $i
> reconfig
>! $itk_interior.m.reg entryconfigure 6 -state normal
> }
>
>
>*************** body RegWin::delete_from_display_list {r
>*** 472,477 ****
>--- 537,543 ----
> body RegWin::edit {r} {
> global reg_display
> if {$Running} { return }
>+ if {!$reg_display($r,editable)} {return}
> unedit
>
> set Editing $r
>*************** body RegWin::acceptEdit {r} {
>*** 502,508 ****
> }
> if {[catch {gdb_cmd "set \$$reg_display($r,name)=$value"} result]} {
> tk_messageBox -icon error -type ok -message $result \
>! -title "Error in Expression" -parent $this
> focus $ScrolledWin.$r.ent
> $ScrolledWin.$r.ent selection to end
> } else {
>--- 568,574 ----
> }
> if {[catch {gdb_cmd "set \$$reg_display($r,name)=$value"} result]} {
> tk_messageBox -icon error -type ok -message $result \
>! -title "Error in Expression" -parent [winfo toplevel $itk_interior]
> focus $ScrolledWin.$r.ent
> $ScrolledWin.$r.ent selection to end
> } else {
>*************** body RegWin::acceptEdit {r} {
>*** 512,517 ****
>--- 578,591 ----
> }
>
> # ------------------------------------------------------------------
>+ # PUBLIC METHOD: addToWatch - add a register to the watch window
>+ # ------------------------------------------------------------------
>+ body RegWin::addToWatch {reg} {
>+ global reg_display
>+ [ManagedWin::open WatchWin] add "\$$reg_display($reg,name)"
>+ }
>+
>+ # ------------------------------------------------------------------
> # PUBLIC METHOD: unedit - clear any editing entry on the screen
> # ------------------------------------------------------------------
> body RegWin::unedit {} {
>*************** body RegWin::update {} {
>*** 537,563 ****
> set changed_reg_list {}
> }
>
>! set vmax 0
> foreach r $reg_display_list {
>! if {[catch {gdb_fetch_registers $reg_display($r,format) $r}
>values($r)]} {
> set values($r) ""
> } else {
>! set values($r) [string trim $values($r) \ ]
> }
> set l [string length $values($r)]
>! if {$l > $vmax} {
>! set vmax $l
> }
> }
>
> foreach r $reg_display_list {
> if {[lsearch -exact $changed_reg_list $r] != -1} {
> set fg $HighlightForeground
> } else {
> set fg $NormalForeground
> }
>! $ScrolledWin.$r.val configure -text [fixLength $values($r) $vmax
>right] \
> -fg $fg
> }
> debug "END REGISTER UPDATE CALLBACK"
> }
>--- 611,682 ----
> set changed_reg_list {}
> }
>
>! set row 0
>! set col 0
> foreach r $reg_display_list {
>! if {$row == 0} {
>! # A minimum of 10 so the appearence is nice
>! set vmax($col) 10
>! }
>!
>! # Typed registers natural values start with a brace (escaped by a slash)
>! if {[catch {gdb_fetch_registers {} $r} valtest]} {
> set values($r) ""
>+ } else {
>+ if {[string index $valtest 1] == "\{"} {
>+ # If it is a typed register, we print it raw
>+ set format r
>+ set reg_display($r,format) r
>+ set reg_display($r,typed) 1
>+ } else {
>+ set format $reg_display($r,format)
>+ }
>+ if {[catch {gdb_fetch_registers $format $r} values($r)]} {
>+ set values($r) ""
>+ } else {
>+ set values($r) [string trim $values($r) \ ]
>+ }
>+ }
>+
>+ # Check if we can edit this value
>+ if {[catch {gdb_cmd "set \$$reg_display($r,name)=$valtest"} rst]} {
>+ set reg_display($r,editable) 0
> } else {
>! set reg_display($r,editable) 1
> }
>+ # Make sure we did not changed the original value with the test above
>+ catch {gdb_fetch_registers {} $r} valtest2
>+ if {$valtest2 != $valtest} {
>+ tk_messageBox -icon error -type ok -message "Register value
>clobbered!" \
>+ -title "Internal Error" -parent [winfo toplevel $itk_interior]
>+ }
>+
> set l [string length $values($r)]
>! if {$l > $vmax($col)} {
>! set vmax($col) $l
>! }
>! incr row
>! if {$row == $nRows} {
>! set row 0
>! incr col
> }
> }
>
>+ set row 0
>+ set col 0
> foreach r $reg_display_list {
> if {[lsearch -exact $changed_reg_list $r] != -1} {
> set fg $HighlightForeground
> } else {
> set fg $NormalForeground
> }
>! $ScrolledWin.$r.val configure -text [fixLength $values($r)
>$vmax($col) right] \
> -fg $fg
>+ incr row
>+ if {$row == $nRows} {
>+ set row 0
>+ incr col
>+ }
> }
> debug "END REGISTER UPDATE CALLBACK"
> }
>Index: regwin.ith
>===================================================================
>RCS file: /cvs/src/src/gdb/gdbtk/library/regwin.ith,v
>retrieving revision 1.2
>diff -c -p -r1.2 regwin.ith
>*** regwin.ith 2000/04/05 23:53:12 1.2
>--- regwin.ith 2000/05/02 19:24:23
>*************** class RegWin {
>*** 56,61 ****
>--- 56,62 ----
> method but3 {rn X Y}
> method display_all {}
> method delete_from_display_list {rn}
>+ method addToWatch {reg}
> method edit {r}
> method acceptEdit {r}
> method unedit {}
>Index: tclIndex
>===================================================================
>RCS file: /cvs/src/src/gdb/gdbtk/library/tclIndex,v
>retrieving revision 1.3
>diff -c -p -r1.3 tclIndex
>*** tclIndex 2000/03/28 01:59:40 1.3
>--- tclIndex 2000/05/02 19:24:23
>*************** set auto_index(::RegWin::fixLength) [lis
>*** 393,398 ****
>--- 393,399 ----
> set auto_index(::RegWin::but3) [list source [file join $dir regwin.itb]]
> set auto_index(::RegWin::display_all) [list source [file join $dir
> regwin.itb]]
> set auto_index(::RegWin::delete_from_display_list) [list source [file
> join $dir regwin.itb]]
>+ set auto_index(::RegWin::addToWatch) [list source [file join $dir
>regwin.itb]]
> set auto_index(::RegWin::edit) [list source [file join $dir regwin.itb]]
> set auto_index(::RegWin::acceptEdit) [list source [file join $dir
> regwin.itb]]
> set auto_index(::RegWin::unedit) [list source [file join $dir regwin.itb]]
>Index: variables.tcl
>===================================================================
>RCS file: /cvs/src/src/gdb/gdbtk/library/variables.tcl,v
>retrieving revision 1.2
>diff -c -p -r1.2 variables.tcl
>*** variables.tcl 2000/03/30 22:14:24 1.2
>--- variables.tcl 2000/05/02 19:24:23
>*************** class VariableWin {
>*** 534,539 ****
>--- 534,543 ----
> $Editing.ent selection to end
> } else {
> UnEdit
>+
>+ # We may have changed a register or something else that is
>+ # being displayed in another window
>+ gdbtk_update
>
> # Get rid of entry... and replace it with new value
> focus $Tree
Syd Polk
Engineering Manager
Cygnus Solutions,a Red Hat company