From mboxrd@z Thu Jan 1 00:00:00 1970 From: Syd Polk To: Fernando Nasser , insight@sourceware.cygnus.com Subject: Re: RFA: Fixes to the Registers window Date: Wed, 03 May 2000 10:44:00 -0000 Message-id: <4.2.0.58.20000503104415.00b8dc10@pop.cygnus.com> References: <390F2D7B.FEAA501@cygnus.com> X-SW-Source: 2000-q2/msg00168.html 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 >+ >+ * 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 > > 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