URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [insight/] [gdb/] [gdbtk/] [library/] [stackwin.itb] - Rev 1765
Compare with Previous | Blame | View Log
# Stack window for GDBtk.# Copyright 1997, 1998, 1999 Cygnus Solutions## 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# ------------------------------------------------------------------body StackWin::constructor {args} {gdbtk_busybuild_wingdbtk_idleadd_hook gdb_no_inferior_hook [code $this no_inferior]}# ------------------------------------------------------------------# DESTRUCTOR - destroy window containing widget# ------------------------------------------------------------------body StackWin::destructor {} {remove_hook gdb_no_inferior_hook [code $this no_inferior]}# ------------------------------------------------------------------# METHOD: build_win - build the main register window# ------------------------------------------------------------------body StackWin::build_win {} {global tixOption tcl_platformif {$tcl_platform(platform) == "windows"} {tixScrolledListBox $itk_interior.s -scrollbar both -sizebox 1} else {tixScrolledListBox $itk_interior.s -scrollbar auto}set lb [$itk_interior.s subwidget listbox]$lb configure -selectmode single -bg $tixOption(input1_bg) \-selectbackground [pref get gdb/src/STACK_TAG] \-selectforeground black \-font src-font \-exportselection falseupdate dummy$lb configure -width $maxwidth# bind mouse button 1 to change the stack framebind $lb <ButtonPress-1> [code $this change_frame %y]bind $lb <ButtonRelease-1> breakpack $itk_interior.s -side left -expand yes -fill bothwindow_name "Stack"}# ------------------------------------------------------------------# METHOD: update - update widget when PC changes# ------------------------------------------------------------------body StackWin::update {event} {global gdb_selected_frame_levelif {!$protect_me} {set lb [$itk_interior.s subwidget listbox]# 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} {$lb delete 0 end$lb insert end {NO STACK}return}$lb delete 0 endset levels 0foreach frame $frames {set len [string length $frame]if {$len > $maxwidth} {set maxwidth $len}$lb insert end $frameincr 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 frameset level [expr {$levels - $gdb_selected_frame_level - 1}]$lb selection set $level$lb see $level}}body StackWin::idle {event} {set Running 0cursor {}}# ------------------------------------------------------------------# METHOD: change_frame - change the current frame# This body StackWin::is currently ONLY called from the mouse binding# ------------------------------------------------------------------body StackWin::change_frame {y} {set lb [$itk_interior.s subwidget listbox]if {!$Running && [$lb size] != 0} {gdbtk_busyset lb [$itk_interior.s subwidget listbox]set linenum [$lb nearest $y]set size [$lb size]set linenum [expr {$size - $linenum - 1}]catch {gdb_cmd "frame $linenum"}# Run idle hooks and cause all widgets to updateset protect_me 1gdbtk_updateset protect_me 0gdbtk_idle}}# ------------------------------------------------------------------# METHOD: reconfig - used when preferences change# ------------------------------------------------------------------body StackWin::reconfig {} {destroy $itk_interior.sbuild_win}# ------------------------------------------------------------------# PUBLIC METHOD: busy - BusyEvent handler# This method should cause blocking of clicks in# the window and change mouse pointer.# ------------------------------------------------------------------body StackWin::busy {event} {set Running 1cursor watch}# ------------------------------------------------------------------# METHOD: no_inferior - gdb_no_inferior_hook# ------------------------------------------------------------------body StackWin::no_inferior {} {set Running 0cursor {}}# ------------------------------------------------------------------# METHOD: cursor - set the window cursor# This is a convenience body StackWin::which simply sets the mouse# pointer to the given glyph.# ------------------------------------------------------------------body StackWin::cursor {glyph} {set top [winfo toplevel $itk_interior]$top configure -cursor $glyph}
