+ set vhl_done $max
+}
+
+proc askvhighlight {row id} {
+ global hlview vhighlights commitrow iddrawn mainfont
+
+ if {[info exists commitrow($hlview,$id)]} {
+ if {[info exists iddrawn($id)] && ![ishighlighted $row]} {
+ bolden $row [concat $mainfont bold]
+ }
+ set vhighlights($row) 1
+ } else {
+ set vhighlights($row) 0
+ }
+}
+
+proc hfiles_change {name ix op} {
+ global highlight_files filehighlight fhighlights fh_serial
+ global mainfont
+
+ if {[info exists filehighlight]} {
+ # delete previous highlights
+ catch {close $filehighlight}
+ unset filehighlight
+ set rows [array names fhighlights]
+ if {$rows ne {}} {
+ unset fhighlights
+ unbolden $rows
+ }
+ }
+ after cancel do_file_hl $fh_serial
+ incr fh_serial
+ if {$highlight_files ne {}} {
+ after 300 do_file_hl $fh_serial
+ }
+}
+
+proc do_file_hl {serial} {
+ global highlight_files filehighlight
+
+ if {[catch {set paths [shellsplit $highlight_files]}]} return
+ set cmd [concat | git-diff-tree -r -s --stdin -- $paths]
+ set filehighlight [open $cmd r+]
+ fconfigure $filehighlight -blocking 0
+ fileevent $filehighlight readable readfhighlight
+ drawvisible
+ flushhighlights
+}
+
+proc flushhighlights {} {
+ global filehighlight
+
+ if {[info exists filehighlight]} {
+ puts $filehighlight ""
+ flush $filehighlight
+ }
+}
+
+proc askfilehighlight {row id} {
+ global filehighlight fhighlights
+
+ set fhighlights($row) 0
+ puts $filehighlight $id
+}
+
+proc readfhighlight {} {
+ global filehighlight fhighlights commitrow curview mainfont iddrawn
+
+ set n [gets $filehighlight line]
+ if {$n < 0} {
+ if {[eof $filehighlight]} {
+ # strange...
+ puts "oops, git-diff-tree died"
+ catch {close $filehighlight}
+ unset filehighlight
+ }
+ return
+ }
+ set line [string trim $line]
+ if {$line eq {}} return
+ if {![info exists commitrow($curview,$line)]} return
+ set row $commitrow($curview,$line)
+ if {[info exists iddrawn($line)] && ![ishighlighted $row]} {
+ bolden $row [concat $mainfont bold]
+ }
+ set fhighlights($row) 1
+}
+
+proc hnames_change {name ix op} {
+ global highlight_names nhighlights nhl_names mainfont
+
+ # delete previous highlights, if any
+ set rows [array names nhighlights]
+ if {$rows ne {}} {
+ foreach row $rows {
+ if {$nhighlights($row) >= 2} {
+ bolden_name $row $mainfont
+ }
+ }
+ unset nhighlights
+ unbolden $rows
+ }
+ if {[catch {set nhl_names [shellsplit $highlight_names]}]} {
+ set nhl_names {}
+ return
+ }
+ drawvisible
+}
+
+proc asknamehighlight {row id} {
+ global nhl_names nhighlights commitinfo iddrawn mainfont
+
+ if {![info exists commitinfo($id)]} {
+ getcommit $id
+ }
+ set isbold 0
+ set author [lindex $commitinfo($id) 1]
+ set committer [lindex $commitinfo($id) 3]
+ foreach name $nhl_names {
+ set pattern "*$name*"
+ if {[string match -nocase $pattern $author]} {
+ set isbold 2
+ break
+ }
+ if {!$isbold && [string match -nocase $pattern $committer]} {
+ set isbold 1
+ }
+ }
+ if {[info exists iddrawn($id)]} {
+ if {$isbold && ![ishighlighted $row]} {
+ bolden $row [concat $mainfont bold]
+ }
+ if {$isbold >= 2} {
+ bolden_name $row [concat $mainfont bold]
+ }
+ }
+ set nhighlights($row) $isbold