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.
765 lines
21 KiB
Tcl
765 lines
21 KiB
Tcl
15 years ago
|
# Local preferences functions for Insight.
|
||
|
# Copyright (C) 1997, 1998, 1999, 2002, 2003, 2004, 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.
|
||
|
|
||
|
|
||
|
# On STARTUP:
|
||
|
# 1. Options database (.Xdefaults on Unix or ? on Windows) is read
|
||
|
# 2. GDB prefs file is read ("gdbtk.ini" on Windows; ".gdbtkinit" on Unix)
|
||
|
# 3. GDB init script is read
|
||
|
#
|
||
|
# Normally all preferences will be set in the prefs file, which is
|
||
|
# a generated file. Hand-editing, if necessary, should be done to the
|
||
|
# GDB init script.
|
||
|
#
|
||
|
# when "save options" is selected, the contents of the
|
||
|
# preferences array is written out to the GDB prefs file.
|
||
|
#
|
||
|
# Usage:
|
||
|
# pref_save
|
||
|
# pref_read
|
||
|
# ----------------------------------------------------------------------
|
||
|
#
|
||
|
|
||
|
proc pref_read {} {
|
||
|
global prefs_init_filename env gdb_ImageDir GDBTK_LIBRARY GDBStartup
|
||
|
global gdbtk_platform
|
||
|
|
||
|
if {[info exists env(HOME)]} {
|
||
|
if {$gdbtk_platform(os) == "cygwin"} {
|
||
|
set home [ide_cygwin_path to_win32 $env(HOME)]
|
||
|
} else {
|
||
|
set home $env(HOME)
|
||
|
}
|
||
|
} else {
|
||
|
set home ""
|
||
|
}
|
||
|
|
||
|
if {$gdbtk_platform(platform) == "windows"} {
|
||
|
set prefs_init_filename "gdbtk.ini"
|
||
|
} else {
|
||
|
set prefs_init_filename ".gdbtkinit"
|
||
|
}
|
||
|
|
||
|
if {!$GDBStartup(inhibit_prefs) \
|
||
|
|| [info exists env(INSIGHT_FORCE_READ_PREFERENCES)]} {
|
||
|
set file_opened 0
|
||
|
if {[file exists $prefs_init_filename]} {
|
||
|
if {[catch {open $prefs_init_filename r} fd]} {
|
||
|
dbug E "$fd"
|
||
|
return
|
||
|
}
|
||
|
set file_opened 1
|
||
|
} elseif {$home != ""} {
|
||
|
set name [file join $home $prefs_init_filename]
|
||
|
if {[file exists $name]} {
|
||
|
if {[catch {open $name r} fd]} {
|
||
|
dbug E "$fd"
|
||
|
return
|
||
|
}
|
||
|
set prefs_init_filename $name
|
||
|
set file_opened 1
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if {$file_opened == "1"} {
|
||
|
set section gdb
|
||
|
set version 0
|
||
|
while {[gets $fd line] >= 0} {
|
||
|
switch -regexp -- $line {
|
||
|
{^[ \t\n]*#.*} {
|
||
|
# Comment. We recognize one magic comment that includes
|
||
|
# the version number.
|
||
|
if {[regexp -- "^# GDBtkInitVersion: (\[0-9\]+)\$" $line \
|
||
|
dummy v]} {
|
||
|
set version $v
|
||
|
}
|
||
|
}
|
||
|
|
||
|
{^[ \t\n]*$} {
|
||
|
;# empty line; ignore it
|
||
|
}
|
||
|
|
||
|
{^[ \t\n]*\[.*\]} {
|
||
|
regexp {\[(.*)\]} $line match section
|
||
|
}
|
||
|
|
||
|
{^[ \t\n]*option.*} {
|
||
|
set line [string trimleft $line]
|
||
|
eval $line
|
||
|
}
|
||
|
|
||
|
default {
|
||
|
set a ""
|
||
|
set name ""
|
||
|
set val ""
|
||
|
regexp "\[ \t\n\]*\(.+\)=\(.+\)" $line a name val
|
||
|
if {$a == "" || $name == ""} {
|
||
|
dbug W "Cannot parse line: $line"
|
||
|
} else {
|
||
|
# Must unescape equal signs in val
|
||
|
set val [unescape_value $val $version]
|
||
|
if {$section == "gdb"} {
|
||
|
pref setd gdb/$name $val
|
||
|
} elseif {$section == "global" && [regexp "^font/" $name]} {
|
||
|
set name [split $name /]
|
||
|
set f global/
|
||
|
append f [join [lrange $name 1 end] /]
|
||
|
if {[lsearch [font names] $f] == -1} {
|
||
|
# new font
|
||
|
eval define_font $f $val
|
||
|
} else {
|
||
|
# existing font
|
||
|
pref set global/font/[join [lrange $name 1 end] /] $val
|
||
|
}
|
||
|
} elseif {$section == "global"} {
|
||
|
pref setd $section/$name $val
|
||
|
} else {
|
||
|
# backwards compatibility. recognize old src-font name
|
||
|
if {$val == "src-font"} {set val "global/fixed"}
|
||
|
pref setd gdb/$section/$name $val
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
close $fd
|
||
|
} elseif {$home != ""} {
|
||
|
set prefs_init_filename [file join $home $prefs_init_filename]
|
||
|
}
|
||
|
|
||
|
# now set global options
|
||
|
set gdb_ImageDir [file join $GDBTK_LIBRARY [pref get gdb/ImageDir]]
|
||
|
|
||
|
}
|
||
|
|
||
|
# finally set colors, from system if possible
|
||
|
if {[pref get gdb/use_color_schemes] != "1"} {
|
||
|
pref_set_colors $home
|
||
|
} else {
|
||
|
global Colors
|
||
|
# These colors are the same for all schemes
|
||
|
set Colors(textfg) black
|
||
|
set Colors(fg) black
|
||
|
set Colors(sbg) \#4c59a5
|
||
|
set Colors(sfg) white
|
||
|
set_bg_colors
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# ------------------------------------------------------------------
|
||
|
# PROC: pref_save - save preferences to a file and delete window
|
||
|
# ------------------------------------------------------------------
|
||
|
proc pref_save {{win {}}} {
|
||
|
global prefs_init_filename GDBStartup env
|
||
|
|
||
|
if {!$GDBStartup(inhibit_prefs)
|
||
|
|| [info exists env(INSIGHT_FORCE_READ_PREFERENCES)]} {
|
||
|
debug "pref_save $prefs_init_filename"
|
||
|
|
||
|
if {[catch {open $prefs_init_filename w} fd]} {
|
||
|
debug "ERROR: $fd"
|
||
|
return
|
||
|
}
|
||
|
|
||
|
puts $fd "\# GDBtk Init file"
|
||
|
puts $fd {# GDBtkInitVersion: 1}
|
||
|
|
||
|
set plist [pref list]
|
||
|
# write out global options
|
||
|
puts $fd "\[global\]"
|
||
|
foreach var $plist {
|
||
|
set t [split $var /]
|
||
|
if {[lindex $t 0] == "global"} {
|
||
|
set x [join [lrange $t 1 end] /]
|
||
|
set v [escape_value [pref get $var]]
|
||
|
|
||
|
if {$x != "" && $v != ""} {
|
||
|
puts $fd "\t$x=$v"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# write out gdb-global options
|
||
|
puts $fd "\[gdb\]"
|
||
|
foreach var $plist {
|
||
|
set t [split $var /]
|
||
|
# We use the funny join/lreplace code because the session code
|
||
|
# can generate a key where [lindex $t 2] is empty but there is
|
||
|
# still stuff after that. This happens because the session code
|
||
|
# uses filenames, which can start with `/'.
|
||
|
if {[lindex $t 0] == "gdb"
|
||
|
&& [string compare [join [lreplace $t 0 1] /] ""] == 0} {
|
||
|
set x [lindex $t 1]
|
||
|
set v [escape_value [pref get $var]]
|
||
|
if {$x != "" && $v != ""} {
|
||
|
puts $fd "\t$x=$v"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# now loop through all sections writing out values
|
||
|
# FIXME: this is broken. We should discover the list
|
||
|
# dynamically.
|
||
|
lappend secs load console src reg stack locals watch bp search \
|
||
|
process geometry help browser kod window session mem bg ipc
|
||
|
|
||
|
foreach section $secs {
|
||
|
puts $fd "\[$section\]"
|
||
|
foreach var $plist {
|
||
|
set t [split $var /]
|
||
|
if {[lindex $t 0] == "gdb" && [lindex $t 1] == $section} {
|
||
|
set x [join [lrange $t 2 end] /]
|
||
|
set v [escape_value [pref get $var]]
|
||
|
if {$x != "" && $v != ""} {
|
||
|
puts $fd "\t$x=$v"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
close $fd
|
||
|
}
|
||
|
|
||
|
if {$win != ""} {
|
||
|
$win delete
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# -------------------------------------------------------
|
||
|
# PROC: escape_value - escape all equal signs for saving
|
||
|
# prefs to a file
|
||
|
# -------------------------------------------------------
|
||
|
proc escape_value {val} {
|
||
|
# We use a URL-style quoting. We encode `=', `%', the `[]'
|
||
|
# characters and newlines. We use a cute trick here: we regsub in
|
||
|
# command expressions which we then expand using subst.
|
||
|
if {[info tclversion] >= 8.1} {
|
||
|
set expr {([\[\]=%\n])}
|
||
|
} else {
|
||
|
set expr "(\[\]\[=%\n\])"
|
||
|
}
|
||
|
regsub -all -- $expr $val \
|
||
|
{[format "%%%02x" [scan {\1} %c x; set x]]} newval
|
||
|
return [subst -nobackslashes -novariables $newval]
|
||
|
}
|
||
|
|
||
|
# -------------------------------------------------------
|
||
|
# PROC: unescape_value - unescape all equal signs for
|
||
|
# reading prefs from a file. VERSION is the version
|
||
|
# number of the encoding.
|
||
|
# version 0 only encoded `='.
|
||
|
# version 1 correctly encoded more values
|
||
|
# -------------------------------------------------------
|
||
|
proc unescape_value {val version} {
|
||
|
switch -exact -- $version {
|
||
|
0 {
|
||
|
# Old-style encoding.
|
||
|
if {[regsub -all -- {!%} $val = newval]} {
|
||
|
return $newval
|
||
|
}
|
||
|
}
|
||
|
|
||
|
1 {
|
||
|
# Version 1 uses URL encoding.
|
||
|
regsub -all -- "%(..)" $val \
|
||
|
{[format %c 0x\1]} newval
|
||
|
return [subst -nobackslashes -novariables $newval]
|
||
|
}
|
||
|
|
||
|
default {
|
||
|
error "Unknown encoding version $version"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $val
|
||
|
}
|
||
|
|
||
|
# ------------------------------------------------------------------
|
||
|
# PROC: pref_set_defaults - set up default values
|
||
|
# ------------------------------------------------------------------
|
||
|
proc pref_set_defaults {} {
|
||
|
global GDBTK_LIBRARY gdbtk_platform gdb_ImageDir
|
||
|
debug
|
||
|
|
||
|
# Gdb global defaults
|
||
|
pref define gdb/ImageDir images2
|
||
|
set gdb_ImageDir [file join $GDBTK_LIBRARY [pref get gdb/ImageDir]]
|
||
|
pref define gdb/font_cache ""
|
||
|
pref define gdb/mode 0; # 0 no tracing, 1 tracing enabled
|
||
|
pref define gdb/control_target 1; # 0 can't control target (EMC), 1 can
|
||
|
pref define gdb/B1_behavior 1; # 0 means set/clear breakpoints,
|
||
|
# 1 means set/clear tracepoints.
|
||
|
pref define gdb/use_icons 1; # For Unix, use gdbtk_icon.gif as an icon
|
||
|
# some window managers can't deal with it.
|
||
|
|
||
|
# OS compatibility. Valid values are "Windows", "GNOME", "KDE", and "default"
|
||
|
if {$gdbtk_platform(platform) == "windows"} {
|
||
|
pref define gdb/compat "Windows"
|
||
|
} elseif {$gdbtk_platform(platform) == "unix"} {
|
||
|
pref define gdb/compat "GNOME"
|
||
|
} else {
|
||
|
pref define gdb/compat "default"
|
||
|
}
|
||
|
|
||
|
# set download and execution options
|
||
|
pref define gdb/load/verbose 0
|
||
|
pref define gdb/load/main 1
|
||
|
pref define gdb/load/exit 1
|
||
|
pref define gdb/load/check 0
|
||
|
pref define gdb/load/bp_at_func 0
|
||
|
pref define gdb/load/bp_func ""
|
||
|
pref define gdb/load/baud 38400
|
||
|
if {$gdbtk_platform(platform) == "windows"} {
|
||
|
pref define gdb/load/port com1
|
||
|
} else {
|
||
|
pref define gdb/load/port "/dev/ttyS0"
|
||
|
}
|
||
|
|
||
|
# The list of active windows:
|
||
|
pref define gdb/window/active {}
|
||
|
|
||
|
# Console defaults
|
||
|
pref define gdb/console/prompt "(gdb) "
|
||
|
pref define gdb/console/deleteLeft 1
|
||
|
pref define gdb/console/wrap 0
|
||
|
pref define gdb/console/prompt_fg DarkGreen
|
||
|
pref define gdb/console/error_fg red
|
||
|
pref define gdb/console/log_fg green
|
||
|
pref define gdb/console/target_fg blue
|
||
|
pref define gdb/console/font global/fixed
|
||
|
|
||
|
# Source window defaults
|
||
|
pref define gdb/src/PC_TAG green
|
||
|
pref define gdb/src/STACK_TAG gold
|
||
|
pref define gdb/src/BROWSE_TAG \#9595e2
|
||
|
pref define gdb/src/handlebg red
|
||
|
pref define gdb/src/bp_fg red
|
||
|
pref define gdb/src/temp_bp_fg orange
|
||
|
pref define gdb/src/disabled_fg black
|
||
|
pref define gdb/src/font global/fixed
|
||
|
pref define gdb/src/break_fg black
|
||
|
pref define gdb/src/source2_fg navy
|
||
|
pref define gdb/src/variableBalloons 1
|
||
|
pref define gdb/src/trace_fg magenta
|
||
|
pref define gdb/src/tab_size 8
|
||
|
pref define gdb/src/linenums 1
|
||
|
pref define gdb/src/thread_fg pink
|
||
|
pref define gdb/src/top_control 1; # 1 srctextwin controls on top, 0 bottom
|
||
|
|
||
|
# Define the run button's functions. These are defined here in case
|
||
|
# we do a "run" with an exec target (which never causes target.tcl to
|
||
|
# source)...
|
||
|
pref define gdb/src/run_attach 0
|
||
|
pref define gdb/src/run_load 0
|
||
|
pref define gdb/src/run_run 1
|
||
|
pref define gdb/src/run_cont 0
|
||
|
|
||
|
# This is the disassembly flavor. For now this is only supported on x86
|
||
|
# machines.
|
||
|
|
||
|
pref define gdb/src/disassembly-flavor ""
|
||
|
|
||
|
# Variable Window defaults
|
||
|
pref define gdb/variable/font global/fixed
|
||
|
pref define gdb/variable/disabled_fg gray
|
||
|
|
||
|
# Stack Window
|
||
|
pref define gdb/stack/font global/fixed
|
||
|
|
||
|
# Register Window
|
||
|
pref define gdb/reg/rows 16
|
||
|
|
||
|
# Global Prefs Dialogs
|
||
|
pref define gdb/global_prefs/save_fg red
|
||
|
pref define gdb/global_prefs/message_fg white
|
||
|
pref define gdb/global_prefs/message_bg red
|
||
|
|
||
|
# Browser Window Search
|
||
|
pref define gdb/search/last_symbol ""
|
||
|
pref define gdb/search/filter_mode "starts with"
|
||
|
|
||
|
pref define gdb/browser/hide_h 0
|
||
|
pref define gdb/browser/layout 2
|
||
|
|
||
|
# BP (breakpoint)
|
||
|
pref define gdb/bp/show_threads 0
|
||
|
|
||
|
# Help
|
||
|
pref define gdb/help/browsername ""
|
||
|
|
||
|
# Kernel Objects (kod)
|
||
|
pref define gdb/kod/show_icon 0
|
||
|
|
||
|
# Various possible "main" functions. What's for Java?
|
||
|
pref define gdb/main_names [list main MAIN___ MAIN__ cyg_user_start cyg_start ]
|
||
|
|
||
|
# These are the classes of warning dialogs, and whether the user plans
|
||
|
# to ignore them.
|
||
|
pref define gdb/warnings/signal 0
|
||
|
|
||
|
# Memory window.
|
||
|
pref define gdb/mem/size 4
|
||
|
pref define gdb/mem/numbytes 0
|
||
|
pref define gdb/mem/format x
|
||
|
pref define gdb/mem/ascii 1
|
||
|
pref define gdb/mem/ascii_char .
|
||
|
pref define gdb/mem/bytes_per_row 16
|
||
|
pref define gdb/mem/color green
|
||
|
|
||
|
# External editor.
|
||
|
pref define gdb/editor ""
|
||
|
|
||
|
# background colors
|
||
|
set ::gdb_bg_num 0
|
||
|
pref define gdb/use_color_schemes 1
|
||
|
pref define gdb/bg/0 \#ffffff
|
||
|
pref define gdb/bg/1 \#ffffd0
|
||
|
pref define gdb/bg/2 \#ffd0ff
|
||
|
pref define gdb/bg/3 \#ffd0d0
|
||
|
pref define gdb/bg/4 \#d0ffff
|
||
|
pref define gdb/bg/5 \#d0ffd0
|
||
|
pref define gdb/bg/6 \#d0d0ff
|
||
|
pref define gdb/bg/7 \#d0d0d0
|
||
|
pref define gdb/bg/8 \#ffffb0
|
||
|
pref define gdb/bg/9 \#ffb0ff
|
||
|
pref define gdb/bg/10 \#ffb0b0
|
||
|
pref define gdb/bg/11 \#b0ffff
|
||
|
pref define gdb/bg/12 \#b0ffb0
|
||
|
pref define gdb/bg/13 \#b0b0ff
|
||
|
pref define gdb/bg/14 \#b0b0b0
|
||
|
pref define gdb/bg/15 \#d0b0d0
|
||
|
|
||
|
# IPC prefs
|
||
|
# set prefs based on GDB version?
|
||
|
#set vers [lindex [split [lindex [split [gdb_cmd "show version"]] end-1 ] \"] 1]
|
||
|
pref define gdb/ipc/enabled 0
|
||
|
pref define gdb/ipc/port 9909
|
||
|
pref define gdb/ipc/stop_button 1
|
||
|
pref define gdb/ipc/step_button 1
|
||
|
pref define gdb/ipc/cont_button 1
|
||
|
pref define gdb/ipc/run_button 1
|
||
|
pref define gdb/ipc/exit 1
|
||
|
}
|
||
|
|
||
|
|
||
|
##########################################################################
|
||
|
#
|
||
|
# Everything below this point is code to try to determine the current OS
|
||
|
# color scheme and use that. It mostly works, but is not very compatible
|
||
|
# with the use of multiple color schemes for different instances of Insight.
|
||
|
#
|
||
|
##########################################################################
|
||
|
proc pref_set_colors {home} {
|
||
|
# set color palette
|
||
|
|
||
|
# In the past, tk widgets got their color information from Windows or
|
||
|
# the X resource database. Unfortunately Insight is a mixture of widgets
|
||
|
# from all over and was coded first in tcl and later in itcl. So lots of
|
||
|
# color inheritance is broken or wrong. And Insight has some special color
|
||
|
# requirements. We also have to deal with new Unix desktops that don't use the Xrdb.
|
||
|
# To enable us to fix that without hardcoding colors, we create a color
|
||
|
# array here and use it as needed to force widgets to the correct colors.
|
||
|
|
||
|
global Colors
|
||
|
debug
|
||
|
|
||
|
# UNIX colors
|
||
|
|
||
|
# For KDE3 (and probably earlier versions) when the user sets
|
||
|
# a color scheme from the KDE control center, the appropriate color
|
||
|
# information is set in the X resource database. Well, most of it
|
||
|
# is there but it is missing some settings, so we will carefully
|
||
|
# adjust things.
|
||
|
#
|
||
|
# For GNOME, we read .gtkrc or .gtkrc-1.2-gnome2 and parse it
|
||
|
# for the color information. We cannot really get this right,
|
||
|
# but with luck we can read enough to get the colors to mostly match.
|
||
|
|
||
|
# If there is no information, we provide reasonable defaults.
|
||
|
|
||
|
# If some theme sets the text foreground and background to something unusual
|
||
|
# then Insight won't be able to display sources and highlight things properly.
|
||
|
# Therefore we will not change the textfg and textbg.
|
||
|
|
||
|
switch [pref get gdb/compat] {
|
||
|
|
||
|
"Windows" {
|
||
|
debug "loading OS colors for Windows"
|
||
|
set Colors(fg) SystemButtonText
|
||
|
set Colors(bg) SystemButtonFace
|
||
|
#set Colors(textfg) SystemWindowText
|
||
|
#set Colors(textbg) SystemWindow
|
||
|
set Colors(textfg) black
|
||
|
set Colors(textbg) white
|
||
|
set Colors(sfg) SystemHighlightText
|
||
|
set Colors(sbg) SystemHighlight
|
||
|
pref_set_option_db 0
|
||
|
}
|
||
|
|
||
|
"KDE" {
|
||
|
debug "loading OS colors for KDE"
|
||
|
|
||
|
pref_load_default
|
||
|
# try loading "~/.gtkrc-kde"
|
||
|
if {[pref_load_gnome $home [list .gtkrc-kde]]} {
|
||
|
debug "loaded gnome file"
|
||
|
pref_set_option_db 0
|
||
|
debug "loaded option file"
|
||
|
} else {
|
||
|
# no .gtkrc-kde so assume X defaults have been set
|
||
|
|
||
|
# create an empty entry widget so we can query its colors
|
||
|
entry .e
|
||
|
|
||
|
# text background
|
||
|
# set Colors(textbg) [option get .e background {}]
|
||
|
set Colors(textbg) white
|
||
|
|
||
|
# text foreground
|
||
|
#set Colors(textfg) [option get .e foreground {}]
|
||
|
set Colors(textfg) black
|
||
|
|
||
|
# background
|
||
|
set Colors(bg) [option get . background {}]
|
||
|
if {$Colors(bg) == ""} {set Colors(bg) lightgray}
|
||
|
|
||
|
# foreground
|
||
|
set Colors(fg) [option get . foreground {}]
|
||
|
if {$Colors(fg) == ""} {set Colors(fg) black}
|
||
|
|
||
|
# selectBackground
|
||
|
set Colors(sbg) [option get .e selectBackground {}]
|
||
|
if {$Colors(sbg) == ""} {set Colors(sbg) blue}
|
||
|
|
||
|
# selectForeground
|
||
|
set Colors(sfg) [option get .e selectForeground {}]
|
||
|
if {$Colors(sfg) == ""} {set Colors(sfg) white}
|
||
|
|
||
|
destroy .e
|
||
|
pref_set_option_db 1
|
||
|
}
|
||
|
}
|
||
|
|
||
|
"GNOME" {
|
||
|
pref_load_default
|
||
|
pref_load_gnome $home
|
||
|
pref_set_option_db 0
|
||
|
}
|
||
|
|
||
|
"default" {
|
||
|
pref_load_default
|
||
|
pref_set_option_db 1
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
proc pref_load_default {} {
|
||
|
global Colors
|
||
|
debug "loading default colors"
|
||
|
|
||
|
set Colors(textbg) white
|
||
|
set Colors(textfg) black
|
||
|
set Colors(bg) lightgray
|
||
|
set Colors(fg) black
|
||
|
|
||
|
# selectBackground
|
||
|
set Colors(sbg) blue
|
||
|
|
||
|
# selectForeground
|
||
|
set Colors(sfg) white
|
||
|
}
|
||
|
|
||
|
|
||
|
# load GNOME colors and fonts, if possible.
|
||
|
proc pref_load_gnome {home {possible_names {}}} {
|
||
|
debug "loading OS colors for GNOME"
|
||
|
|
||
|
if {$possible_names == ""} {
|
||
|
set possible_names {.gtkrc .gtkrc-1.2-gnome2}
|
||
|
}
|
||
|
|
||
|
set found 0
|
||
|
foreach name $possible_names {
|
||
|
debug "home=$home name=$name"
|
||
|
set fname [file join $home $name]
|
||
|
debug "fname=$fname"
|
||
|
if {[file exists $fname]} {
|
||
|
if {[catch {open $fname r} fd]} {
|
||
|
dbug W "cannot open $fname: $fd"
|
||
|
return 0
|
||
|
}
|
||
|
set found 1
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
if {$found} {
|
||
|
set found [load_gnome_file $fd]
|
||
|
close $fd
|
||
|
}
|
||
|
return $found
|
||
|
}
|
||
|
|
||
|
proc load_gnome_file {fd} {
|
||
|
global Colors
|
||
|
set found 0
|
||
|
|
||
|
while {[gets $fd line] >= 0} {
|
||
|
if {[regexp {include \"([^\"]*)} $line foo incname]} {
|
||
|
debug "include $incname $found"
|
||
|
if {$found == 0 && [file exists $incname]} {
|
||
|
if {[catch {open $incname r} fd2]} {
|
||
|
dbug W "cannot open $incname: $fd2"
|
||
|
} else {
|
||
|
set found [load_gnome_file $fd2]
|
||
|
close $fd2
|
||
|
if {$found} {
|
||
|
return $found
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
continue
|
||
|
} elseif {[regexp "\[ \t\n\]*\(.+\) = \(.+\)" $line a name val] == 0} {
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
if {[regexp "\"#......\"" $val a] == 1} {
|
||
|
set val [lindex $a 0]
|
||
|
} else {
|
||
|
set res [scan $val "\{ %f, %f, %f \}" r g b]
|
||
|
if {$res != 3} {
|
||
|
continue
|
||
|
}
|
||
|
set r [expr int($r*255)]
|
||
|
set g [expr int($g*255)]
|
||
|
set b [expr int($b*255)]
|
||
|
set val [format "\#%02x%02x%02x" $r $g $b]
|
||
|
}
|
||
|
|
||
|
debug "name=\"$name\" val=\"$val\""
|
||
|
|
||
|
# This is a bit of a hack and probably only
|
||
|
# works for trivial cases. Scan for colors and
|
||
|
# use the first one found.
|
||
|
switch [string trimright $name] {
|
||
|
{bg[NORMAL]} {
|
||
|
set found 1
|
||
|
if {![info exists new(bg)]} {
|
||
|
debug "setting bg to $val"
|
||
|
set new(bg) $val
|
||
|
}
|
||
|
}
|
||
|
{base[NORMAL]} {
|
||
|
#if {![info exists new(textbg)]} {
|
||
|
# set new(textbg) $val
|
||
|
#}
|
||
|
}
|
||
|
{text[NORMAL]} {
|
||
|
#if {![info exists new(textfg)]} {
|
||
|
# set new(textfg) $val
|
||
|
#}
|
||
|
}
|
||
|
{fg[NORMAL]} {
|
||
|
if {![info exists new(fg)]} {
|
||
|
set new(fg) $val
|
||
|
}
|
||
|
}
|
||
|
{fg[ACTIVE]} {
|
||
|
if {![info exists new(afg)]} {
|
||
|
set new(afg) $val
|
||
|
}
|
||
|
}
|
||
|
{bg[SELECTED]} {
|
||
|
if {![info exists new(sbg)]} {
|
||
|
set new(sbg) $val
|
||
|
}
|
||
|
}
|
||
|
{base[SELECTED]} {
|
||
|
if {![info exists new(sbg)]} {
|
||
|
set new(sbg) $val
|
||
|
}
|
||
|
}
|
||
|
{fg[SELECTED]} {
|
||
|
if {![info exists new(sfg)]} {
|
||
|
set new(sfg) $val
|
||
|
}
|
||
|
}
|
||
|
{fg[INSENSITIVE]} {
|
||
|
if {![info exists new(dfg)]} {
|
||
|
set new(dfg) $val
|
||
|
}
|
||
|
}
|
||
|
{bg[PRELIGHT]} {
|
||
|
set Colors(prelight) $val
|
||
|
}
|
||
|
{base[PRELIGHT]} {
|
||
|
set Colors(prelight) $val
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
foreach c {fg bg sfg sbg dfg} {
|
||
|
if {[info exists new($c)]} {
|
||
|
set Colors($c) $new($c)
|
||
|
}
|
||
|
}
|
||
|
return 1
|
||
|
}
|
||
|
|
||
|
|
||
|
# load the colors into the tcl option database
|
||
|
proc pref_set_option_db {makebg} {
|
||
|
global Colors
|
||
|
|
||
|
# The color of text that indicates changed items
|
||
|
# We standardize on one color here so that changed
|
||
|
# items don't blend into any OS color scheme
|
||
|
set Colors(change) "green"
|
||
|
|
||
|
option add *background $Colors(bg)
|
||
|
option add *buttonBackground $Colors(bg)
|
||
|
option add *Text*background $Colors(textbg)
|
||
|
option add *Entry*background $Colors(textbg)
|
||
|
option add *foreground $Colors(fg)
|
||
|
option add *Text*foreground $Colors(textfg)
|
||
|
option add *Entry*foreground $Colors(textfg)
|
||
|
|
||
|
option add *highlightBackground $Colors(bg)
|
||
|
option add *selectBackground $Colors(sbg)
|
||
|
|
||
|
if {$::gdbtk_platform(platform) == "unix"} {
|
||
|
option add *activeBackground $Colors(sbg)
|
||
|
}
|
||
|
|
||
|
option add *selectForeground $Colors(sfg)
|
||
|
option add *Menu*activeForeground $Colors(sfg)
|
||
|
|
||
|
if {[info exists Colors(prelight)]} {
|
||
|
option add *Button*activeBackground $Colors(prelight)
|
||
|
}
|
||
|
if {[info exists Colors(dfg)]} {
|
||
|
option add *disabledForeground $Colors(dfg)
|
||
|
}
|
||
|
|
||
|
if {$makebg} {
|
||
|
# calculate trough and activebackground as 90% of background
|
||
|
set dbg [recolor $::Colors(bg) 90]
|
||
|
option add *activeBackground $dbg
|
||
|
option add *troughColor $dbg
|
||
|
}
|
||
|
|
||
|
# Change the default select color for checkbuttons, etc to match
|
||
|
# selectBackground.
|
||
|
if {$::gdbtk_platform(platform) == "unix"} {
|
||
|
option add *selectColor $Colors(sbg)
|
||
|
}
|
||
|
}
|