| # Stack window for Insight. |
| # Copyright (C) 1997, 1998, 1999, 2002, 2003, 2008 Red Hat |
| # |
| # This program is free software; you can redistribute it and/or modify it |
| # under the terms of the GNU General Public License (GPL) as published by |
| # the Free Software Foundation; either version 2 of the License, or (at |
| # your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| |
| |
| # ------------------------------------------------------------------ |
| # CONSTRUCTOR - create new stack window |
| # ------------------------------------------------------------------ |
| itcl::body StackWin::constructor {args} { |
| gdbtk_busy |
| build_win |
| gdbtk_idle |
| |
| add_hook gdb_no_inferior_hook [code $this no_inferior] |
| } |
| |
| # ------------------------------------------------------------------ |
| # DESTRUCTOR - destroy window containing widget |
| # ------------------------------------------------------------------ |
| itcl::body StackWin::destructor {} { |
| remove_hook gdb_no_inferior_hook [code $this no_inferior] |
| } |
| |
| # ------------------------------------------------------------------ |
| # METHOD: build_win - build the main register window |
| # ------------------------------------------------------------------ |
| itcl::body StackWin::build_win {} { |
| |
| itk_component add slb { |
| iwidgets::scrolledlistbox $itk_interior.s \ |
| -vscrollmode dynamic -hscrollmode dynamic \ |
| -selectmode single -exportselection false -visibleitems 30x15 \ |
| -textfont global/fixed -selectioncommand [code $this change_frame] |
| } |
| |
| [$itk_component(slb) component listbox] configure \ |
| -bg $::Colors(textbg) -fg $::Colors(textfg) |
| |
| update dummy |
| |
| pack $itk_interior.s -side left -expand yes -fill both |
| |
| window_name "Stack" |
| } |
| |
| |
| # ------------------------------------------------------------------ |
| # METHOD: update - update widget when PC changes |
| # ------------------------------------------------------------------ |
| itcl::body StackWin::update {event} { |
| global gdb_selected_frame_level |
| |
| if {!$protect_me} { |
| # The gdb_stack command might fail, for instance if you are browsing |
| # a trace experiment, and the stack has not been collected. |
| |
| if {[catch {gdb_stack 0 -1} frames]} { |
| dbug W "Error in stack collection $frames" |
| set frames {} |
| } |
| |
| if {[llength $frames] == 0} { |
| $itk_component(slb) delete 0 end |
| $itk_component(slb) insert end {NO STACK} |
| return |
| } |
| |
| $itk_component(slb) delete 0 end |
| set levels 0 |
| foreach frame $frames { |
| set len [string length $frame] |
| |
| if {$len > $maxwidth} { |
| set maxwidth $len |
| } |
| $itk_component(slb) insert end $frame |
| incr levels |
| } |
| |
| # this next section checks to see if the source |
| # window is looking at some location other than the |
| # bottom of the stack. If so, highlight the stack frame |
| set level [expr {$levels - $gdb_selected_frame_level - 1}] |
| $itk_component(slb) selection set $level |
| $itk_component(slb) see $level |
| } |
| } |
| |
| itcl::body StackWin::idle {event} { |
| set Running 0 |
| cursor {} |
| } |
| |
| # ------------------------------------------------------------------ |
| # METHOD: change_frame - change the current frame |
| # This method is currently ONLY called from the mouse binding |
| # ------------------------------------------------------------------ |
| itcl::body StackWin::change_frame {} { |
| |
| if {!$Running && [$itk_component(slb) size] != 0} { |
| gdbtk_busy |
| set sel [$itk_component(slb) curselection] |
| set size [$itk_component(slb) size] |
| set frame_num [expr {$size - $sel - 1}] |
| catch {gdb_cmd "frame $frame_num"} |
| |
| # Run idle hooks and cause all widgets to update |
| set protect_me 1 |
| gdbtk_update |
| set protect_me 0 |
| gdbtk_idle |
| } |
| } |
| |
| # ------------------------------------------------------------------ |
| # METHOD: reconfig - used when preferences change |
| # ------------------------------------------------------------------ |
| itcl::body StackWin::reconfig {} { |
| destroy $itk_interior.s |
| build_win |
| } |
| |
| # ------------------------------------------------------------------ |
| # PUBLIC METHOD: busy - BusyEvent handler |
| # This method should cause blocking of clicks in |
| # the window and change mouse pointer. |
| # ------------------------------------------------------------------ |
| itcl::body StackWin::busy {event} { |
| set Running 1 |
| cursor watch |
| } |
| |
| # ------------------------------------------------------------------ |
| # METHOD: no_inferior - gdb_no_inferior_hook |
| # ------------------------------------------------------------------ |
| itcl::body StackWin::no_inferior {} { |
| set Running 0 |
| cursor {} |
| } |
| |
| # ------------------------------------------------------------------ |
| # METHOD: cursor - set the window cursor |
| # This is a convenience method which simply sets the mouse |
| # pointer to the given glyph. |
| # ------------------------------------------------------------------ |
| itcl::body StackWin::cursor {glyph} { |
| set top [winfo toplevel $itk_interior] |
| $top configure -cursor $glyph |
| } |