221 lines
6.9 KiB
Tcl
221 lines
6.9 KiB
Tcl
# palette.tcl --
|
|
#
|
|
# This file contains procedures that change the color palette used
|
|
# by Tk.
|
|
#
|
|
# SCCS: @(#) palette.tcl 1.2 96/02/16 10:48:25
|
|
#
|
|
# Copyright (c) 1995 Sun Microsystems, Inc.
|
|
#
|
|
# See the file "license.terms" for information on usage and redistribution
|
|
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
|
#
|
|
|
|
# tk_setPalette --
|
|
# Changes the default color scheme for a Tk application by setting
|
|
# default colors in the option database and by modifying all of the
|
|
# color options for existing widgets that have the default value.
|
|
#
|
|
# Arguments:
|
|
# The arguments consist of either a single color name, which
|
|
# will be used as the new background color (all other colors will
|
|
# be computed from this) or an even number of values consisting of
|
|
# option names and values. The name for an option is the one used
|
|
# for the option database, such as activeForeground, not -activeforeground.
|
|
|
|
proc tk_setPalette args {
|
|
global tkPalette
|
|
|
|
# Create an array that has the complete new palette. If some colors
|
|
# aren't specified, compute them from other colors that are specified.
|
|
|
|
if {[llength $args] == 1} {
|
|
set new(background) [lindex $args 0]
|
|
} else {
|
|
array set new $args
|
|
}
|
|
if ![info exists new(background)] {
|
|
error "must specify a background color"
|
|
}
|
|
if ![info exists new(foreground)] {
|
|
set new(foreground) black
|
|
}
|
|
set bg [winfo rgb . $new(background)]
|
|
set fg [winfo rgb . $new(foreground)]
|
|
set darkerBg [format #%02x%02x%02x [expr (9*[lindex $bg 0])/2560] \
|
|
[expr (9*[lindex $bg 1])/2560] [expr (9*[lindex $bg 2])/2560]]
|
|
foreach i {activeForeground insertBackground selectForeground \
|
|
highlightColor} {
|
|
if ![info exists new($i)] {
|
|
set new($i) $new(foreground)
|
|
}
|
|
}
|
|
if ![info exists new(disabledForeground)] {
|
|
set new(disabledForeground) [format #%02x%02x%02x \
|
|
[expr (3*[lindex $bg 0] + [lindex $fg 0])/1024] \
|
|
[expr (3*[lindex $bg 1] + [lindex $fg 1])/1024] \
|
|
[expr (3*[lindex $bg 2] + [lindex $fg 2])/1024]]
|
|
}
|
|
if ![info exists new(highlightBackground)] {
|
|
set new(highlightBackground) $new(background)
|
|
}
|
|
if ![info exists new(activeBackground)] {
|
|
# Pick a default active background that islighter than the
|
|
# normal background. To do this, round each color component
|
|
# up by 15% or 1/3 of the way to full white, whichever is
|
|
# greater.
|
|
|
|
foreach i {0 1 2} {
|
|
set light($i) [expr [lindex $bg $i]/256]
|
|
set inc1 [expr ($light($i)*15)/100]
|
|
set inc2 [expr (255-$light($i))/3]
|
|
if {$inc1 > $inc2} {
|
|
incr light($i) $inc1
|
|
} else {
|
|
incr light($i) $inc2
|
|
}
|
|
if {$light($i) > 255} {
|
|
set light($i) 255
|
|
}
|
|
}
|
|
set new(activeBackground) [format #%02x%02x%02x $light(0) \
|
|
$light(1) $light(2)]
|
|
}
|
|
if ![info exists new(selectBackground)] {
|
|
set new(selectBackground) $darkerBg
|
|
}
|
|
if ![info exists new(troughColor)] {
|
|
set new(troughColor) $darkerBg
|
|
}
|
|
if ![info exists new(selectColor)] {
|
|
set new(selectColor) #b03060
|
|
}
|
|
|
|
# Walk the widget hierarchy, recoloring all existing windows.
|
|
# Before doing this, make sure that the tkPalette variable holds
|
|
# the default values of all options, so that tkRecolorTree can
|
|
# be sure to only change options that have their default values.
|
|
# If the variable exists, then it is already correct (it was created
|
|
# the last time this procedure was invoked). If the variable
|
|
# doesn't exist, fill it in using the defaults from a few widgets.
|
|
|
|
if ![info exists tkPalette] {
|
|
checkbutton .c14732
|
|
entry .e14732
|
|
scrollbar .s14732
|
|
set tkPalette(activeBackground) \
|
|
[lindex [.c14732 configure -activebackground] 3]
|
|
set tkPalette(activeForeground) \
|
|
[lindex [.c14732 configure -activeforeground] 3]
|
|
set tkPalette(background) \
|
|
[lindex [.c14732 configure -background] 3]
|
|
set tkPalette(disabledForeground) \
|
|
[lindex [.c14732 configure -disabledforeground] 3]
|
|
set tkPalette(foreground) \
|
|
[lindex [.c14732 configure -foreground] 3]
|
|
set tkPalette(highlightBackground) \
|
|
[lindex [.c14732 configure -highlightbackground] 3]
|
|
set tkPalette(highlightColor) \
|
|
[lindex [.c14732 configure -highlightcolor] 3]
|
|
set tkPalette(insertBackground) \
|
|
[lindex [.e14732 configure -insertbackground] 3]
|
|
set tkPalette(selectColor) \
|
|
[lindex [.c14732 configure -selectcolor] 3]
|
|
set tkPalette(selectBackground) \
|
|
[lindex [.e14732 configure -selectbackground] 3]
|
|
set tkPalette(selectForeground) \
|
|
[lindex [.e14732 configure -selectforeground] 3]
|
|
set tkPalette(troughColor) \
|
|
[lindex [.s14732 configure -troughcolor] 3]
|
|
destroy .c14732 .e14732 .s14732
|
|
}
|
|
tkRecolorTree . new
|
|
|
|
# Change the option database so that future windows will get the
|
|
# same colors.
|
|
|
|
foreach option [array names new] {
|
|
option add *$option $new($option) widgetDefault
|
|
}
|
|
|
|
# Save the options in the global variable tkPalette, for use the
|
|
# next time we change the options.
|
|
|
|
array set tkPalette [array get new]
|
|
}
|
|
|
|
# tkRecolorTree --
|
|
# This procedure changes the colors in a window and all of its
|
|
# descendants, according to information provided by the colors
|
|
# argument. It only modifies colors that have their default values
|
|
# as specified by the tkPalette variable.
|
|
#
|
|
# Arguments:
|
|
# w - The name of a window. This window and all its
|
|
# descendants are recolored.
|
|
# colors - The name of an array variable in the caller,
|
|
# which contains color information. Each element
|
|
# is named after a widget configuration option, and
|
|
# each value is the value for that option.
|
|
|
|
proc tkRecolorTree {w colors} {
|
|
global tkPalette
|
|
upvar $colors c
|
|
foreach dbOption [array names c] {
|
|
set option -[string tolower $dbOption]
|
|
if ![catch {$w cget $option} value] {
|
|
if {$value == $tkPalette($dbOption)} {
|
|
$w configure $option $c($dbOption)
|
|
}
|
|
}
|
|
}
|
|
foreach child [winfo children $w] {
|
|
tkRecolorTree $child c
|
|
}
|
|
}
|
|
|
|
# tkDarken --
|
|
# Given a color name, computes a new color value that darkens (or
|
|
# brightens) the given color by a given percent.
|
|
#
|
|
# Arguments:
|
|
# color - Name of starting color.
|
|
# perecent - Integer telling how much to brighten or darken as a
|
|
# percent: 50 means darken by 50%, 110 means brighten
|
|
# by 10%.
|
|
|
|
proc tkDarken {color percent} {
|
|
set l [winfo rgb . $color]
|
|
set red [expr [lindex $l 0]/256]
|
|
set green [expr [lindex $l 1]/256]
|
|
set blue [expr [lindex $l 2]/256]
|
|
set red [expr ($red*$percent)/100]
|
|
if {$red > 255} {
|
|
set red 255
|
|
}
|
|
set green [expr ($green*$percent)/100]
|
|
if {$green > 255} {
|
|
set green 255
|
|
}
|
|
set blue [expr ($blue*$percent)/100]
|
|
if {$blue > 255} {
|
|
set blue 255
|
|
}
|
|
format #%02x%02x%02x $red $green $blue
|
|
}
|
|
|
|
# tk_bisque --
|
|
# Reset the Tk color palette to the old "bisque" colors.
|
|
#
|
|
# Arguments:
|
|
# None.
|
|
|
|
proc tk_bisque {} {
|
|
tk_setPalette activeBackground #e6ceb1 activeForeground black \
|
|
background #ffe4c4 disabledForeground #b0b0b0 foreground black \
|
|
highlightBackground #ffe4c4 highlightColor black \
|
|
insertBackground black selectColor #b03060 \
|
|
selectBackground #e6ceb1 selectForeground black \
|
|
troughColor #cdb79e
|
|
}
|