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]

RFA: Fixes to the Registers window


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

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