blob: 9be258eb6e5fcf2fcb199f6c28a769505727cb1e [file] [log] [blame]
# 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