@@ -2516,6 +2516,13 @@ proc makewindow {} {
25162516 } else {
25172517 bindall <ButtonRelease-4> " allcanvs yview scroll -5 units"
25182518 bindall <ButtonRelease-5> " allcanvs yview scroll 5 units"
2519+ bind $ctext <Button> {
2520+ if {" %b" eq 6} {
2521+ $ctext xview scroll -5 units
2522+ } elseif {" %b" eq 7} {
2523+ $ctext xview scroll 5 units
2524+ }
2525+ }
25192526 if {[tk windowingsystem] eq " aqua" } {
25202527 bindall <MouseWheel> {
25212528 set delta [expr {- (%D)}]
@@ -2776,33 +2783,87 @@ proc doprogupdate {} {
27762783 }
27772784}
27782785
2786+ proc config_check_tmp_exists {tries_left} {
2787+ global config_file_tmp
2788+
2789+ if {[file exists $config_file_tmp ]} {
2790+ incr tries_left -1
2791+ if {$tries_left > 0} {
2792+ after 100 [list config_check_tmp_exists $tries_left ]
2793+ } else {
2794+ error_popup " There appears to be a stale $config_file_tmp \
2795+ file, which will prevent gitk from saving its configuration on exit.\
2796+ Please remove it if it is not being used by any existing gitk process."
2797+ }
2798+ }
2799+ }
2800+
2801+ proc config_init_trace {name} {
2802+ global config_variable_changed config_variable_original
2803+
2804+ upvar #0 $name var
2805+ set config_variable_changed($name ) 0
2806+ set config_variable_original($name ) $var
2807+ }
2808+
2809+ proc config_variable_change_cb {name name2 op} {
2810+ global config_variable_changed config_variable_original
2811+
2812+ upvar #0 $name var
2813+ if {$op eq " write" &&
2814+ (![info exists config_variable_original($name )] ||
2815+ $config_variable_original($name) ne $var )} {
2816+ set config_variable_changed($name ) 1
2817+ }
2818+ }
2819+
27792820proc savestuff {w} {
2780- global viewname viewfiles viewargs viewargscmd viewperm nextviewnum
2781- global use_ttk
27822821 global stuffsaved
27832822 global config_file config_file_tmp
2784- global config_variables
2823+ global config_variables config_variable_changed
2824+ global viewchanged
2825+
2826+ upvar #0 viewname current_viewname
2827+ upvar #0 viewfiles current_viewfiles
2828+ upvar #0 viewargs current_viewargs
2829+ upvar #0 viewargscmd current_viewargscmd
2830+ upvar #0 viewperm current_viewperm
2831+ upvar #0 nextviewnum current_nextviewnum
2832+ upvar #0 use_ttk current_use_ttk
27852833
27862834 if {$stuffsaved } return
27872835 if {![winfo viewable .]} return
2788- catch {
2789- if {[file exists $config_file_tmp ]} {
2790- file delete -force $config_file_tmp
2836+ set remove_tmp 0
2837+ if {[catch {
2838+ set try_count 0
2839+ while {[catch {set f [open $config_file_tmp {WRONLY CREAT EXCL}]}]} {
2840+ if {[incr try_count] > 50} {
2841+ error " Unable to write config file: $config_file_tmp exists"
2842+ }
2843+ after 100
27912844 }
2792- set f [ open $config_file_tmp w]
2845+ set remove_tmp 1
27932846 if {$::tcl_platform(platform) eq {windows}} {
27942847 file attributes $config_file_tmp -hidden true
27952848 }
2849+ if {[file exists $config_file ]} {
2850+ source $config_file
2851+ }
27962852 foreach var_name $config_variables {
27972853 upvar #0 $var_name var
2798- puts $f [list set $var_name $var ]
2854+ upvar 0 $var_name old_var
2855+ if {!$config_variable_changed($var_name) && [info exists old_var]} {
2856+ puts $f [list set $var_name $old_var ]
2857+ } else {
2858+ puts $f [list set $var_name $var ]
2859+ }
27992860 }
28002861
28012862 puts $f " set geometry(main) [ wm geometry .] "
28022863 puts $f " set geometry(state) [ wm state .] "
28032864 puts $f " set geometry(topwidth) [ winfo width .tf] "
28042865 puts $f " set geometry(topheight) [ winfo height .tf] "
2805- if {$use_ttk } {
2866+ if {$current_use_ttk } {
28062867 puts $f " set geometry(pwsash0) \" [ .tf.histframe.pwclist sashpos 0] 1\" "
28072868 puts $f " set geometry(pwsash1) \" [ .tf.histframe.pwclist sashpos 1] 1\" "
28082869 } else {
@@ -2812,15 +2873,43 @@ proc savestuff {w} {
28122873 puts $f " set geometry(botwidth) [ winfo width .bleft] "
28132874 puts $f " set geometry(botheight) [ winfo height .bleft] "
28142875
2876+ array set view_save {}
2877+ array set views {}
2878+ if {![info exists permviews]} { set permviews {} }
2879+ foreach view $permviews {
2880+ set view_save([lindex $view 0]) 1
2881+ set views([lindex $view 0]) $view
2882+ }
28152883 puts -nonewline $f " set permviews {"
2816- for {set v 0} {$v < $nextviewnum } {incr v} {
2817- if {$viewperm($v) } {
2818- puts $f " {[ list $viewname($v) $viewfiles($v) $viewargs($v) $viewargscmd($v) ] }"
2884+ for {set v 1} {$v < $current_nextviewnum } {incr v} {
2885+ if {$viewchanged($v) } {
2886+ if {$current_viewperm($v) } {
2887+ set views($current_viewname($v) ) [list $current_viewname($v) $current_viewfiles($v) $current_viewargs($v) $current_viewargscmd($v) ]
2888+ } else {
2889+ set view_save($current_viewname($v) ) 0
2890+ }
2891+ }
2892+ }
2893+ # write old and updated view to their places and append remaining to the end
2894+ foreach view $permviews {
2895+ set view_name [lindex $view 0]
2896+ if {$view_save($view_name) } {
2897+ puts $f " {$views($view_name) }"
28192898 }
2899+ unset views($view_name )
2900+ }
2901+ foreach view_name [array names views] {
2902+ puts $f " {$views($view_name) }"
28202903 }
28212904 puts $f " }"
28222905 close $f
28232906 file rename -force $config_file_tmp $config_file
2907+ set remove_tmp 0
2908+ } err]} {
2909+ puts " Error saving config: $err "
2910+ }
2911+ if {$remove_tmp } {
2912+ file delete -force $config_file_tmp
28242913 }
28252914 set stuffsaved 1
28262915}
@@ -3977,6 +4066,7 @@ set known_view_options {
39774066 {committer t15 . " --committer=*" {mc " Committer:" }}
39784067 {loginfo t15 .. " --grep=*" {mc " Commit Message:" }}
39794068 {allmatch b .. " --all-match" {mc " Matches all Commit Info criteria" }}
4069+ {igrep b .. " --invert-grep" {mc " Matches none Commit Info criteria" }}
39804070 {changes_l l + {} {mc " Changes to Files:" }}
39814071 {pickaxe_s r0 . {} {mc " Fixed String" }}
39824072 {pickaxe_t r1 . " --pickaxe-regex" {mc " Regular Expression" }}
@@ -4238,7 +4328,7 @@ proc allviewmenus {n op args} {
42384328
42394329proc newviewok {top n {apply 0}} {
42404330 global nextviewnum newviewperm newviewname newishighlight
4241- global viewname viewfiles viewperm selectedview curview
4331+ global viewname viewfiles viewperm viewchanged selectedview curview
42424332 global viewargs viewargscmd newviewopts viewhlmenu
42434333
42444334 if {[catch {
@@ -4259,6 +4349,7 @@ proc newviewok {top n {apply 0}} {
42594349 incr nextviewnum
42604350 set viewname($n ) $newviewname($n)
42614351 set viewperm($n ) $newviewopts($n,perm)
4352+ set viewchanged($n ) 1
42624353 set viewfiles($n ) $files
42634354 set viewargs($n ) $newargs
42644355 set viewargscmd($n ) $newviewopts($n,cmd)
@@ -4271,6 +4362,7 @@ proc newviewok {top n {apply 0}} {
42714362 } else {
42724363 # editing an existing view
42734364 set viewperm($n ) $newviewopts($n,perm)
4365+ set viewchanged($n ) 1
42744366 if {$newviewname($n) ne $viewname($n) } {
42754367 set viewname($n ) $newviewname($n)
42764368 doviewmenu .bar.view 5 [list showview $n ] \
@@ -4293,7 +4385,7 @@ proc newviewok {top n {apply 0}} {
42934385}
42944386
42954387proc delview {} {
4296- global curview viewperm hlview selectedhlview
4388+ global curview viewperm hlview selectedhlview viewchanged
42974389
42984390 if {$curview == 0} return
42994391 if {[info exists hlview] && $hlview == $curview } {
@@ -4302,6 +4394,7 @@ proc delview {} {
43024394 }
43034395 allviewmenus $curview delete
43044396 set viewperm($curview ) 0
4397+ set viewchanged($curview ) 1
43054398 showview 0
43064399}
43074400
@@ -11237,6 +11330,7 @@ proc prefspage_general {notebook} {
1123711330 ${NS} ::label $page .maxwidthl -text [mc " Maximum graph width (lines)" ]
1123811331 spinbox $page .maxwidth -from 0 -to 100 -width 4 -textvariable maxwidth
1123911332 grid $page .spacer $page .maxwidthl $page .maxwidth -sticky w
11333+ # xgettext:no-tcl-format
1124011334 ${NS} ::label $page .maxpctl -text [mc " Maximum graph width (% of pane)" ]
1124111335 spinbox $page .maxpct -from 1 -to 100 -width 4 -textvariable maxgraphpct
1124211336 grid x $page .maxpctl $page .maxpct -sticky w
@@ -11936,7 +12030,7 @@ if { [info exists ::env(GIT_TRACE)] } {
1193612030}
1193712031
1193812032# defaults...
11939- set wrcomcmd " git diff-tree --stdin -p --pretty"
12033+ set wrcomcmd " git diff-tree --stdin -p --pretty=email "
1194012034
1194112035set gitencoding {}
1194212036catch {
@@ -12109,6 +12203,7 @@ catch {
1210912203 }
1211012204 source $config_file
1211112205}
12206+ config_check_tmp_exists 50
1211212207
1211312208set config_variables {
1211412209 mainfont textfont uifont tabstop findmergefiles maxgraphpct maxwidth
@@ -12122,6 +12217,10 @@ set config_variables {
1212212217 linehoveroutlinecolor mainheadcirclecolor workingfilescirclecolor
1212312218 indexcirclecolor circlecolors linkfgcolor circleoutlinecolor
1212412219}
12220+ foreach var $config_variables {
12221+ config_init_trace $var
12222+ trace add variable $var write config_variable_change_cb
12223+ }
1212512224
1212612225parsefont mainfont $mainfont
1212712226eval font create mainfont [fontflags mainfont]
@@ -12249,6 +12348,7 @@ set highlight_related [mc "None"]
1224912348set highlight_files {}
1225012349set viewfiles(0) {}
1225112350set viewperm(0) 0
12351+ set viewchanged(0) 0
1225212352set viewargs(0) {}
1225312353set viewargscmd(0) {}
1225412354
@@ -12307,6 +12407,7 @@ if {$cmdline_files ne {} || $revtreeargs ne {} || $revtreeargscmd ne {}} {
1230712407 set viewargs(1) $revtreeargs
1230812408 set viewargscmd(1) $revtreeargscmd
1230912409 set viewperm(1) 0
12410+ set viewchanged(1) 0
1231012411 set vdatemode(1) 0
1231112412 addviewmenu 1
1231212413 .bar.view entryconf [mca " Edit view..." ] -state normal
@@ -12322,6 +12423,7 @@ if {[info exists permviews]} {
1232212423 set viewargs($n ) [lindex $v 2]
1232312424 set viewargscmd($n ) [lindex $v 3]
1232412425 set viewperm($n ) 1
12426+ set viewchanged($n ) 0
1232512427 addviewmenu $n
1232612428 }
1232712429}
0 commit comments