| # GDBtk (Insight) entry point |
| # Copyright (C) 1997, 1998, 1999, 2002, 2003, 2004, 2008 Red Hat, Inc. |
| # |
| # 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. |
| |
| |
| # State is controlled by 5 global boolean variables. |
| # |
| # gdb_target_changed |
| # gdb_exe_changed |
| # gdb_running |
| # gdb_downloading |
| # gdb_loaded |
| |
| ################### Initialization code ######################### |
| |
| # If GDBtk fails to start at all, you might want to uncomment one or |
| # both of these. |
| #set tcl_traceExec 2 |
| #set tcl_traceCompile 1 |
| |
| # Add gdb's Tcl library directory to the end of the auto-load search path, if |
| # it isn't already on the path. |
| # Also, add the plugins directory if it exists. |
| # Note: GDBTK_LIBRARY will be set in tcl_findLibrary before main.tcl is called. |
| |
| set gdb_plugins "" |
| if {[info exists auto_path]} { |
| if {[lsearch -exact $auto_path $GDBTK_LIBRARY] < 0} { |
| lappend auto_path $GDBTK_LIBRARY |
| } |
| |
| # Add default plugins directory, which will be [name of exe]/../../lib/insight1.0 |
| set exename [info nameofexecutable] |
| set dir [file join [file dirname [file dirname $exename]] lib insight1.0] |
| if {[file exists $dir]} { |
| lappend gdb_plugins $dir |
| lappend auto_path $dir |
| } |
| # Add any user-specified plugins directories |
| if {[info exists env(INSIGHT_PLUGINS)]} { |
| set dirs [split $env(INSIGHT_PLUGINS) :] |
| lappend gdb_plugins $dirs |
| lappend auto_path $dirs |
| } |
| } |
| |
| |
| # Require the packages we need. Most are loaded already, but this will catch |
| # any odd errors... : |
| |
| foreach p {{Tcl 8.0} {Tk 8.0} {Itcl 3.0} {Itk 3.0} {Gdbtk 1.0} {combobox 2.2} {debug 1.0}} { |
| if {[catch {package require [lindex $p 0] [lindex $p 1]} msg]} { |
| if {![info exists ::env(GDBTK_TEST_RUNNING)] || $::env(GDBTK_TEST_RUNNING) == 0} { |
| if {$::tcl_platform(platform) != "windows"} { |
| puts stderr "Error: $msg" |
| } |
| catch {tk_messageBox -title Error -message $msg -icon error -type ok} |
| } |
| exit -1 |
| } else { |
| #puts "Loaded [lindex $p 0] $msg" |
| } |
| } |
| |
| namespace import itcl::* |
| namespace import debug::* |
| |
| # Finally, load Iwidgets |
| if {[info exists IWIDGETS_LIBRARY]} { |
| lappend auto_path $IWIDGETS_LIBRARY |
| } |
| if {[catch {package require Iwidgets} msg]} { |
| if {![info exists ::env(GDBTK_TEST_RUNNING)] || $::env(GDBTK_TEST_RUNNING) == 0} { |
| if {$::tcl_platform(platform) != "windows"} { |
| puts stderr "Error: $msg" |
| } |
| catch {tk_messageBox -title Error -message $msg -icon error -type ok} |
| } |
| exit -1 |
| } |
| |
| |
| # Environment variables controlling debugging: |
| # GDBTK_TRACE |
| # unset or 0 no tracing |
| # 1 tracing initialized but not started |
| # 2 tracing initialized and started |
| # |
| # GDBTK_DEBUGFILE - filename to write debugging messages and |
| # trace information (if tracing is enabled). |
| # |
| if {[info exists env(GDBTK_TRACE)] && $env(GDBTK_TRACE) != 0} { |
| # WARNING: the tracing code must not trace into itself or |
| # infinite recursion will result. As currently configured |
| # the tracing code will not trace basic tcl functions or anything defined |
| # before debug::init. For this reason we must source the DebugWin |
| # code before debug::init is called. |
| source [file join $GDBTK_LIBRARY debugwin.ith] |
| source [file join $GDBTK_LIBRARY debugwin.itb] |
| |
| # Calling this installs our hooks for tracing and profiling. |
| # This WILL slow things down. |
| ::debug::init |
| |
| if {$env(GDBTK_TRACE) == 2} { |
| ::debug::trace_start |
| } |
| } |
| |
| if {[info exists env(GDBTK_DEBUG)] && $env(GDBTK_DEBUG) != 0} { |
| if {[info exists env(GDBTK_DEBUGFILE)]} { |
| ::debug::logfile $env(GDBTK_DEBUGFILE) |
| } else { |
| ::debug::logfile "insight.log" |
| } |
| } |
| |
| # For testing |
| set _test(interactive) 0 |
| |
| # Set up platform globals. We replace Tcl's tcl_platform with |
| # our own version which knows the difference between cygwin and |
| # mingw. |
| global gdbtk_platform |
| set gdbtk_platform(platform) $tcl_platform(platform) |
| switch $tcl_platform(platform) { |
| windows { |
| if {[llength [info commands ide_cygwin_path]] == 0} { |
| set gdbtk_platform(os) "mingw" |
| } else { |
| set gdbtk_platform(os) "cygwin" |
| } |
| } |
| |
| default { |
| set gdbtk_platform(os) $tcl_platform(os) |
| } |
| } |
| set gdbtk_platform(osVersion) $tcl_platform(osVersion) |
| |
| # set traces on state variables |
| trace variable gdb_running w do_state_hook |
| trace variable gdb_downloading w do_state_hook |
| trace variable gdb_loaded w do_state_hook |
| define_hook state_hook |
| |
| # set up preferences |
| pref init |
| |
| # let libgui tell us how to feel |
| standard_look_and_feel |
| |
| # now let GDB set its default preferences |
| pref_set_defaults |
| |
| # read in preferences |
| pref_read |
| |
| init_disassembly_flavor |
| |
| # initialize state variables |
| initialize_gdbtk |
| |
| # Arrange for session code to notice when file changes. |
| add_hook file_changed_hook Session::notice_file_change |
| |
| ManagedWin::init |
| |
| # This stuff will help us play nice with WindowMaker's AppIcons. |
| # Can't do the first bit yet, since we don't get this from gdb... |
| # wm command . [concat $argv0 $argv] |
| wm group . . |
| |
| # some initial commands to get gdb in the right mode |
| gdb_cmd {set height 0} |
| gdb_cmd {set width 0} |
| |
| if {[info exists env(GDBTK_TEST_RUNNING)] && $env(GDBTK_TEST_RUNNING)} { |
| set gdb_target_name "exec" |
| } else { |
| # gdb_target_name is the name of the GDB target; that is, the argument |
| # to the GDB target command. |
| set gdb_target_name "" |
| # By setting gdb_target_changed, we force a target dialog |
| # to be displayed on the first "run" |
| set gdb_target_changed 1 |
| } |
| |
| update |
| |
| # Uncomment the next line if you want a splash screen at startup... |
| # ManagedWin::open About -transient -expire 5000 |
| |
| # initialize IPC to enable multiple Insight's to communicate |
| # with each other. |
| set iipc 0 |
| if {[pref get gdb/ipc/enabled]} { |
| set ::insight_ipc [Iipc \#auto] |
| } |
| |
| gdbtk_idle |
| |