This is the mail archive of the insight@sourceware.cygnus.com mailing list for the Insight project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: RFA: Fixes to the Registers window


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



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]