You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
5.1 KiB
Plaintext
159 lines
5.1 KiB
Plaintext
# 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
|
|
}
|