Sync with 'master'

next
Junio C Hamano 2025-10-05 15:04:55 -07:00
commit 7b8bcc2412
1 changed files with 164 additions and 119 deletions

View File

@ -2215,6 +2215,7 @@ proc setoptions {} {
}

proc setttkstyle {} {
global theme
eval font configure TkDefaultFont [fontflags mainfont]
eval font configure TkTextFont [fontflags textfont]
eval font configure TkHeadingFont [fontflags mainfont]
@ -2224,6 +2225,10 @@ proc setttkstyle {} {
eval font configure TkIconFont [fontflags uifont]
eval font configure TkMenuFont [fontflags uifont]
eval font configure TkSmallCaptionFont [fontflags uifont]

if {[catch {ttk::style theme use $theme} err]} {
set theme [ttk::style theme use]
}
}

# Make a menu and submenus.
@ -2376,7 +2381,6 @@ proc makewindow {} {
global highlight_files gdttype
global searchstring sstring
global bgcolor fgcolor bglist fglist diffcolors diffbgcolors selectbgcolor
global uifgcolor uifgdisabledcolor
global filesepbgcolor filesepfgcolor
global mergecolors foundbgcolor currentsearchhitbgcolor
global headctxmenu progresscanv progressitem progresscoords statusw
@ -2495,40 +2499,18 @@ proc makewindow {} {
set sha1entry .tf.bar.sha1
set entries $sha1entry
set sha1but .tf.bar.sha1label
button $sha1but -text "[mc "Commit ID:"] " -state disabled -relief flat \
ttk::button $sha1but -text "[mc "Commit ID:"] " -state disabled \
-command gotocommit -width 8
$sha1but conf -disabledforeground [$sha1but cget -foreground]
pack .tf.bar.sha1label -side left
ttk::entry $sha1entry -width $hashlength -font textfont -textvariable sha1string
trace add variable sha1string write sha1change
pack $sha1entry -side left -pady 2

set bm_left_data {
#define left_width 16
#define left_height 16
static unsigned char left_bits[] = {
0x00, 0x00, 0xc0, 0x01, 0xe0, 0x00, 0x70, 0x00, 0x38, 0x00, 0x1c, 0x00,
0x0e, 0x00, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x0e, 0x00, 0x1c, 0x00,
0x38, 0x00, 0x70, 0x00, 0xe0, 0x00, 0xc0, 0x01};
}
set bm_right_data {
#define right_width 16
#define right_height 16
static unsigned char right_bits[] = {
0x00, 0x00, 0xc0, 0x01, 0x80, 0x03, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x1c,
0x00, 0x38, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x00, 0x38, 0x00, 0x1c,
0x00, 0x0e, 0x00, 0x07, 0x80, 0x03, 0xc0, 0x01};
}
image create bitmap bm-left -data $bm_left_data -foreground $uifgcolor
image create bitmap bm-left-gray -data $bm_left_data -foreground $uifgdisabledcolor
image create bitmap bm-right -data $bm_right_data -foreground $uifgcolor
image create bitmap bm-right-gray -data $bm_right_data -foreground $uifgdisabledcolor

ttk::button .tf.bar.leftbut -command goback -state disabled -width 26
.tf.bar.leftbut configure -image [list bm-left disabled bm-left-gray]
ttk::button .tf.bar.leftbut -command goback -state disabled
.tf.bar.leftbut configure -text \u2190 -width 3
pack .tf.bar.leftbut -side left -fill y
ttk::button .tf.bar.rightbut -command goforw -state disabled -width 26
.tf.bar.rightbut configure -image [list bm-right disabled bm-right-gray]
ttk::button .tf.bar.rightbut -command goforw -state disabled
.tf.bar.rightbut configure -text \u2192 -width 3
pack .tf.bar.rightbut -side left -fill y

ttk::label .tf.bar.rowlabel -text [mc "Row"]
@ -2559,31 +2541,8 @@ proc makewindow {} {
# build up the bottom bar of upper window
ttk::label .tf.lbar.flabel -text "[mc "Find"] "

set bm_down_data {
#define down_width 16
#define down_height 16
static unsigned char down_bits[] = {
0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
0x87, 0xe1, 0x8e, 0x71, 0x9c, 0x39, 0xb8, 0x1d,
0xf0, 0x0f, 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01};
}
image create bitmap bm-down -data $bm_down_data -foreground $uifgcolor
ttk::button .tf.lbar.fnext -width 26 -command {dofind 1 1}
.tf.lbar.fnext configure -image bm-down

set bm_up_data {
#define up_width 16
#define up_height 16
static unsigned char up_bits[] = {
0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f,
0xb8, 0x1d, 0x9c, 0x39, 0x8e, 0x71, 0x87, 0xe1,
0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01};
}
image create bitmap bm-up -data $bm_up_data -foreground $uifgcolor
ttk::button .tf.lbar.fprev -width 26 -command {dofind -1 1}
.tf.lbar.fprev configure -image bm-up
ttk::button .tf.lbar.fnext -command {dofind 1 1} -text \u2193 -width 3
ttk::button .tf.lbar.fprev -command {dofind -1 1} -text \u2191 -width 3

ttk::label .tf.lbar.flab2 -text " [mc "commit"] "

@ -2656,7 +2615,7 @@ proc makewindow {} {

ttk::label .bleft.mid.labeldiffcontext -text " [mc "Lines of context"]: "
pack .bleft.mid.diff .bleft.mid.old .bleft.mid.new -side left -ipadx $wgap
spinbox .bleft.mid.diffcontext -width 5 \
ttk::spinbox .bleft.mid.diffcontext -width 5 \
-from 0 -increment 1 -to 10000000 \
-validate all -validatecommand "diffcontextvalidate %P" \
-textvariable diffcontextstring
@ -8910,9 +8869,9 @@ proc sha1change {n1 n2 op} {
}
if {[$sha1but cget -state] == $state} return
if {$state == "normal"} {
$sha1but conf -state normal -relief raised -text "[mc "Goto:"] "
$sha1but conf -state normal -text "[mc "Goto:"] "
} else {
$sha1but conf -state disabled -relief flat -text "[mc "Commit ID:"] "
$sha1but conf -state disabled -text "[mc "Commit ID:"] "
}
}

@ -10294,7 +10253,9 @@ proc refill_reflist {} {
if {![string match "remotes/*" $n] && [string match $reflistfilter $n]} {
if {[commitinview $headids($n) $curview]} {
lappend localrefs [list $n H]
if {[info exists upstreamofref($n)] && [commitinview $headids($upstreamofref($n)) $curview]} {
if {[info exists upstreamofref($n)] && \
[info exists headids($upstreamofref($n))] && \
[commitinview $headids($upstreamofref($n)) $curview]} {
lappend trackedremoterefs [list $upstreamofref($n) R]
}
} else {
@ -11608,9 +11569,10 @@ proc mkfontdisp {font top which} {
set fontpref($font) [set $font]
ttk::button $top.${font}but -text $which \
-command [list choosefont $font $which]
ttk::label $top.$font -relief flat -font $font \
-text $fontattr($font,family) -justify left
ttk::label $top.$font -font $font \
-text $fontattr($font,family)
grid x $top.${font}but $top.$font -sticky w
grid configure $top.$font -sticky ew
}

proc centertext {w} {
@ -11690,48 +11652,52 @@ proc prefspage_general {notebook} {

ttk::label $page.ldisp -text [mc "Commit list display options"] -font mainfontbold
grid $page.ldisp - -sticky w -pady 10

ttk::label $page.spacer -text " "
ttk::label $page.maxwidthl -text [mc "Maximum graph width (lines)"]
spinbox $page.maxwidth -from 0 -to 100 -width 4 -textvariable maxwidth
ttk::spinbox $page.maxwidth -from 0 -to 100 -width 4 -textvariable maxwidth
grid $page.spacer $page.maxwidthl $page.maxwidth -sticky w
#xgettext:no-tcl-format
ttk::label $page.maxpctl -text [mc "Maximum graph width (% of pane)"]
spinbox $page.maxpct -from 1 -to 100 -width 4 -textvariable maxgraphpct
ttk::spinbox $page.maxpct -from 1 -to 100 -width 4 -textvariable maxgraphpct
grid x $page.maxpctl $page.maxpct -sticky w

ttk::checkbutton $page.showlocal -text [mc "Show local changes"] \
-variable showlocalchanges
grid x $page.showlocal -sticky w

ttk::checkbutton $page.hideremotes -text [mc "Hide remote refs"] \
-variable hideremotes
grid x $page.hideremotes -sticky w

ttk::entry $page.refstohide -textvariable refstohide
ttk::frame $page.refstohidef
ttk::label $page.refstohidef.l -text [mc "Refs to hide (space-separated globs)" ]
pack $page.refstohidef.l -side left
pack configure $page.refstohidef.l -padx 10
grid x $page.refstohidef $page.refstohide -sticky ew
ttk::label $page.refstohidel -text [mc "Refs to hide (space-separated globs)"]
grid x $page.refstohidel $page.refstohide -sticky ew
grid configure $page.refstohide -padx {0 5}

ttk::checkbutton $page.autocopy -text [mc "Copy commit ID to clipboard"] \
-variable autocopy
grid x $page.autocopy -sticky w

if {[haveselectionclipboard]} {
ttk::checkbutton $page.autoselect -text [mc "Copy commit ID to X11 selection"] \
-variable autoselect
grid x $page.autoselect -sticky w
}

spinbox $page.autosellen -from 1 -to $hashlength -width 4 -textvariable autosellen
ttk::spinbox $page.autosellen -from 1 -to $hashlength -width 4 -textvariable autosellen
ttk::label $page.autosellenl -text [mc "Length of commit ID to copy"]
grid x $page.autosellenl $page.autosellen -sticky w

ttk::label $page.kscroll1 -text [mc "Wheel scrolling multiplier"]
spinbox $page.kscroll -from 1 -to 20 -width 4 -textvariable kscroll
ttk::spinbox $page.kscroll -from 1 -to 20 -width 4 -textvariable kscroll
grid x $page.kscroll1 $page.kscroll -sticky w

ttk::label $page.ddisp -text [mc "Diff display options"] -font mainfontbold
grid $page.ddisp - -sticky w -pady 10

ttk::label $page.tabstopl -text [mc "Tab spacing"]
spinbox $page.tabstop -from 1 -to 20 -width 4 -textvariable tabstop
ttk::spinbox $page.tabstop -from 1 -to 20 -width 4 -textvariable tabstop
grid x $page.tabstopl $page.tabstop -sticky w

ttk::label $page.wrapcommentl -text [mc "Wrap comment text"]
@ -11745,12 +11711,15 @@ proc prefspage_general {notebook} {
ttk::checkbutton $page.ntag -text [mc "Display nearby tags/heads"] \
-variable showneartags
grid x $page.ntag -sticky w

ttk::label $page.maxrefsl -text [mc "Maximum # tags/heads to show"]
spinbox $page.maxrefs -from 1 -to 1000 -width 4 -textvariable maxrefs
ttk::spinbox $page.maxrefs -from 1 -to 1000 -width 4 -textvariable maxrefs
grid x $page.maxrefsl $page.maxrefs -sticky w

ttk::checkbutton $page.ldiff -text [mc "Limit diffs to listed paths"] \
-variable limitdiffs
grid x $page.ldiff -sticky w

ttk::checkbutton $page.lattr -text [mc "Support per-file encodings"] \
-variable perfile_attrs
grid x $page.lattr -sticky w
@ -11759,76 +11728,109 @@ proc prefspage_general {notebook} {
ttk::frame $page.extdifff
ttk::label $page.extdifff.l -text [mc "External diff tool" ]
ttk::button $page.extdifff.b -text [mc "Choose..."] -command choose_extdiff
pack $page.extdifff.l $page.extdifff.b -side left
pack configure $page.extdifff.l -padx 10
pack $page.extdifff.l -side left
pack $page.extdifff.b -side right -padx {0 5}
grid x $page.extdifff $page.extdifft -sticky ew
grid configure $page.extdifft -padx {0 5}

ttk::entry $page.webbrowser -textvariable web_browser
ttk::frame $page.webbrowserf
ttk::label $page.webbrowserf.l -text [mc "Web browser" ]
pack $page.webbrowserf.l -side left
pack configure $page.webbrowserf.l -padx 10
grid x $page.webbrowserf $page.webbrowser -sticky ew
ttk::label $page.webbrowserl -text [mc "Web browser" ]
grid x $page.webbrowserl $page.webbrowser -sticky ew
grid configure $page.webbrowser -padx {0 5}

grid columnconfigure $page 2 -weight 1

return $page
}

proc prefspage_colors {notebook} {
global uicolor bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor
global bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor
global diffbgcolors
global themeloader

set page [create_prefs_page $notebook.colors]

ttk::label $page.themesel -font mainfontbold \
-text [mc "Themes - change requires restart"]
grid $page.themesel - -sticky w -pady 10

ttk::label $page.themelabel -text [mc "Theme to use after restart"]
makedroplist $page.theme theme {*}[lsort [ttk::style theme names]]
grid x $page.themelabel $page.theme -sticky w

ttk::entry $page.tloadvar -textvariable themeloader
ttk::frame $page.tloadframe
ttk::label $page.tloadframe.l -text [mc "Theme definition file"]
ttk::button $page.tloadframe.b -text [mc "Choose..."] \
-command [list choose_themeloader $page]
pack $page.tloadframe.l -side left
pack $page.tloadframe.b -side right -padx {0 5}
pack configure $page.tloadframe.l -padx 0
grid x $page.tloadframe $page.tloadvar -sticky ew
grid configure $page.tloadvar -padx {0 5}

ttk::label $page.themelabel2 -text \
[mc "The theme definition file may affect all themes."]
ttk::button $page.themebut2 -text [mc "Apply theme"] \
-command [list updatetheme $page]
grid x $page.themebut2 $page.themelabel2 -sticky w

ttk::label $page.cdisp -text [mc "Colors: press to choose"] -font mainfontbold
grid $page.cdisp - -sticky w -pady 10
label $page.ui -padx 40 -relief sunk -background $uicolor
ttk::button $page.uibut -text [mc "Interface"] \
-command [list choosecolor uicolor {} $page [mc "interface"]]
grid x $page.uibut $page.ui -sticky w
label $page.bg -padx 40 -relief sunk -background $bgcolor
ttk::button $page.bgbut -text [mc "Background"] \
-command [list choosecolor bgcolor {} $page [mc "background"]]
grid x $page.bgbut $page.bg -sticky w

label $page.fg -padx 40 -relief sunk -background $fgcolor
ttk::button $page.fgbut -text [mc "Foreground"] \
-command [list choosecolor fgcolor {} $page [mc "foreground"]]
grid x $page.fgbut $page.fg -sticky w

label $page.diffold -padx 40 -relief sunk -background [lindex $diffcolors 0]
ttk::button $page.diffoldbut -text [mc "Diff: old lines"] \
-command [list choosecolor diffcolors 0 $page [mc "diff old lines"]]
grid x $page.diffoldbut $page.diffold -sticky w

label $page.diffoldbg -padx 40 -relief sunk -background [lindex $diffbgcolors 0]
ttk::button $page.diffoldbgbut -text [mc "Diff: old lines bg"] \
-command [list choosecolor diffbgcolors 0 $page [mc "diff old lines bg"]]
grid x $page.diffoldbgbut $page.diffoldbg -sticky w

label $page.diffnew -padx 40 -relief sunk -background [lindex $diffcolors 1]
ttk::button $page.diffnewbut -text [mc "Diff: new lines"] \
-command [list choosecolor diffcolors 1 $page [mc "diff new lines"]]
grid x $page.diffnewbut $page.diffnew -sticky w

label $page.diffnewbg -padx 40 -relief sunk -background [lindex $diffbgcolors 1]
ttk::button $page.diffnewbgbut -text [mc "Diff: new lines bg"] \
-command [list choosecolor diffbgcolors 1 $page [mc "diff new lines bg"]]
grid x $page.diffnewbgbut $page.diffnewbg -sticky w

label $page.hunksep -padx 40 -relief sunk -background [lindex $diffcolors 2]
ttk::button $page.hunksepbut -text [mc "Diff: hunk header"] \
-command [list choosecolor diffcolors 2 $page [mc "diff hunk header"]]
grid x $page.hunksepbut $page.hunksep -sticky w

label $page.markbgsep -padx 40 -relief sunk -background $markbgcolor
ttk::button $page.markbgbut -text [mc "Marked line bg"] \
-command [list choosecolor markbgcolor {} $page [mc "marked line background"]]
grid x $page.markbgbut $page.markbgsep -sticky w

label $page.selbgsep -padx 40 -relief sunk -background $selectbgcolor
ttk::button $page.selbgbut -text [mc "Select bg"] \
-command [list choosecolor selectbgcolor {} $page [mc "background"]]
grid x $page.selbgbut $page.selbgsep -sticky w

grid columnconfigure $page 2 -weight 1

return $page
}

proc prefspage_set_colorswatches {page} {
global uicolor bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor
global bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor
global diffbgcolors

$page.ui configure -background $uicolor
$page.bg configure -background $bgcolor
$page.fg configure -background $fgcolor
$page.diffold configure -background [lindex $diffcolors 0]
@ -11847,6 +11849,7 @@ proc prefspage_fonts {notebook} {
mkfontdisp mainfont $page [mc "Main font"]
mkfontdisp textfont $page [mc "Diff display font"]
mkfontdisp uifont $page [mc "User interface font"]
grid columnconfigure $page 2 -weight 1
return $page
}

@ -11881,7 +11884,7 @@ proc doprefs {} {
grid rowconfigure $notebook 1 -weight 1
raise [lindex $pages 0]

grid $notebook -sticky news -padx 2 -pady 2
grid $notebook -sticky news -padx 3 -pady 3
grid rowconfigure $top 0 -weight 1
grid columnconfigure $top 0 -weight 1

@ -11890,12 +11893,13 @@ proc doprefs {} {
ttk::button $top.buts.can -text [mc "Cancel"] -command prefscan -default normal
bind $top <Key-Return> prefsok
bind $top <Key-Escape> prefscan
grid $top.buts.ok $top.buts.can
grid columnconfigure $top.buts 0 -weight 1 -uniform a
grid columnconfigure $top.buts 1 -weight 1 -uniform a
grid $top.buts - - -pady 10 -sticky ew
grid columnconfigure $top 2 -weight 1
grid $top.buts.ok $top.buts.can -padx 20
grid $top.buts -sticky w -pady 10
bind $top <Visibility> [list focus $top.buts.ok]

# let geometry manager determine run, set minimum size
update idletasks
wm minsize $top [winfo reqwidth $top] [winfo reqheight $top]
}

proc choose_extdiff {} {
@ -11907,6 +11911,51 @@ proc choose_extdiff {} {
}
}

proc run_themeloader {f} {
if {![info exists ::_themefiles_seen]} {
set ::_themefiles_seen [dict create]
}

set fn [file normalize $f]
if {![dict exists $::_themefiles_seen $fn]} {
if {[catch {source $fn} err]} {
error_popup "could not interpret: $fn\n$err"
dict set ::_themefiles_seen $fn 0
} else {
dict set ::_themefiles_seen $fn 1
}
}
return [dict get $::_themefiles_seen $fn]
}

proc updatetheme {prefspage {dotheme 1}} {
global theme
global themeloader
if {$themeloader ne {}} {
if {![run_themeloader $themeloader]} {
set themeloader {}
return
} else {
$prefspage.theme configure -values \
[lsort [ttk::style theme names]]
}
}
if {$dotheme} {
ttk::style theme use $theme
set_gui_colors
prefspage_set_colorswatches $prefspage
}
}

proc choose_themeloader {prefspage} {
global themeloader
set tfile [tk_getOpenFile -title [mc "Gitk: select theme definition"] -multiple false]
if {$tfile ne {}} {
set themeloader $tfile
updatetheme $prefspage 0
}
}

proc choosecolor {v vi prefspage x} {
global $v

@ -11930,21 +11979,6 @@ proc setselbg {c} {
allcanvs itemconf secsel -fill $c
}

# This sets the background color and the color scheme for the whole UI.
# For some reason, tk_setPalette chooses a nasty dark red for selectColor
# if we don't specify one ourselves, which makes the checkbuttons and
# radiobuttons look bad. This chooses white for selectColor if the
# background color is light, or black if it is dark.
proc setui {c} {
if {[tk windowingsystem] eq "win32"} { return }
set bg [winfo rgb . $c]
set selc black
if {[lindex $bg 0] + 1.5 * [lindex $bg 1] + 0.5 * [lindex $bg 2] > 100000} {
set selc white
}
tk_setPalette background $c selectColor $selc
}

proc setbg {c} {
global bglist

@ -11969,10 +12003,9 @@ proc setfg {c} {
}

proc set_gui_colors {} {
global uicolor bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor
global bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor
global diffbgcolors

setui $uicolor
setbg $bgcolor
setfg $fgcolor
$ctext tag conf d0 -foreground [lindex $diffcolors 0]
@ -11994,6 +12027,7 @@ proc prefscan {} {
catch {destroy $prefstop}
unset prefstop
fontcan
setttkstyle
set_gui_colors
}

@ -12460,11 +12494,13 @@ namespace import ::msgcat::mc

# on OSX bring the current Wish process window to front
if {[tk windowingsystem] eq "aqua"} {
safe_exec [list osascript -e [format {
tell application "System Events"
set frontmost of processes whose unix id is %d to true
end tell
} [pid] ]]
catch {
safe_exec [list osascript -e [format {
tell application "System Events"
set frontmost of processes whose unix id is %d to true
end tell
} [pid] ]]
}
}

# Unset GIT_TRACE var if set
@ -12569,17 +12605,11 @@ if {[tk windowingsystem] eq "aqua"} {

set colors {"#00ff00" red blue magenta darkgrey brown orange}
if {[tk windowingsystem] eq "win32"} {
set uicolor SystemButtonFace
set uifgcolor SystemButtonText
set uifgdisabledcolor SystemDisabledText
set bgcolor SystemWindow
set fgcolor SystemWindowText
set selectbgcolor SystemHighlight
set web_browser "cmd /c start"
} else {
set uicolor grey85
set uifgcolor black
set uifgdisabledcolor "#999"
set bgcolor white
set fgcolor black
set selectbgcolor gray85
@ -12619,6 +12649,12 @@ set circleoutlinecolor $fgcolor
set foundbgcolor yellow
set currentsearchhitbgcolor orange

set theme [ttk::style theme use]
set themeloader {}
set uicolor {}
set uifgcolor {}
set uifgdisabledcolor {}

# button for popping up context menus
if {[tk windowingsystem] eq "aqua" && [package vcompare $::tcl_version 8.7] < 0} {
set ctxbut <Button-2>
@ -12702,6 +12738,8 @@ set config_variables {
tagfgcolor
tagoutlinecolor
textfont
theme
themeloader
uicolor
uifgcolor
uifgdisabledcolor
@ -12801,7 +12839,13 @@ set nullid "0000000000000000000000000000000000000000"
set nullid2 "0000000000000000000000000000000000000001"
set nullfile "/dev/null"

setttkstyle
if {[file exists $themeloader]} {
if {![run_themeloader $themeloader]} {
puts stderr "Could not interpret themeloader: $themeloader"
exit 1
}
}

set appname "gitk"

set runq {}
@ -12917,6 +12961,7 @@ if {[tk windowingsystem] eq "win32"} {
focus -force .
}

setttkstyle
set_gui_colors

getcommits {}