Make gitk work reasonably well on Cygwin.

The gitk gui layout was completely broken on Cygwin. If gitk was started
without previous geometry in ~/.gitk, the user could drag the window sashes
to get a useable layout. However, if ~/.gitk existed, this was not possible
at all.

The fix was to rewrite makewindow, changing the toplevel containers and
the particular geometry information saved between sessions. Numerous bugs
in both the Cygwin and the Linux Tk versions make this a delicate
balancing act: the version here works in both but many subtle variants
are competely broken in one or the other environment.

Three user visible changes result:
1 - The viewer is fully functional under Cygwin.
2 - The search bar moves from the bottom to the top of the lower left
    pane. This was necessary to get around a layout problem on Cygwin.
3 - The window size and position is saved and restored between sessions.
    Again, this is necessary to get around a layout problem on Cygwin.

Signed-off-by: Mark Levedahl <mdl123@verizon.net>
This commit is contained in:
Mark Levedahl 2007-02-01 08:46:38 -05:00 committed by Junio C Hamano
parent 32364b3a19
commit 3468e71f45

272
gitk
View file

@ -435,56 +435,59 @@ proc makewindow {} {
.bar.help configure -font $uifont .bar.help configure -font $uifont
. configure -menu .bar . configure -menu .bar
if {![info exists geometry(canv1)]} { # the gui has upper and lower half, parts of a paned window.
set geometry(canv1) [expr {45 * $charspc}]
set geometry(canv2) [expr {30 * $charspc}]
set geometry(canv3) [expr {15 * $charspc}]
set geometry(canvh) [expr {25 * $linespc + 4}]
set geometry(ctextw) 80
set geometry(ctexth) 30
set geometry(cflistw) 30
}
panedwindow .ctop -orient vertical panedwindow .ctop -orient vertical
if {[info exists geometry(width)]} {
.ctop conf -width $geometry(width) -height $geometry(height) # possibly use assumed geometry
set texth [expr {$geometry(height) - $geometry(canvh) - 56}] if {![info exists geometry(topheight)]} {
set geometry(ctexth) [expr {($texth - 8) / set geometry(topheight) [expr {15 * $linespc}]
[font metrics $textfont -linespace]}] set geometry(topwidth) [expr {80 * $charspc}]
set geometry(botheight) [expr {15 * $linespc}]
set geometry(botwidth) [expr {50 * $charspc}]
set geometry(canv) [expr {40 * $charspc}]
set geometry(canv2) [expr {20 * $charspc}]
set geometry(canv3) [expr {20 * $charspc}]
} }
frame .ctop.top
frame .ctop.top.bar # the upper half will have a paned window, a scroll bar to the right, and some stuff below
frame .ctop.top.lbar frame .tf -height $geometry(topheight) -width $geometry(topwidth)
pack .ctop.top.lbar -side bottom -fill x frame .tf.histframe
pack .ctop.top.bar -side bottom -fill x panedwindow .tf.histframe.pwclist -orient horizontal -sashpad 0 -handlesize 4
set cscroll .ctop.top.csb
scrollbar $cscroll -command {allcanvs yview} -highlightthickness 0 # create three canvases
pack $cscroll -side right -fill y set cscroll .tf.histframe.csb
panedwindow .ctop.top.clist -orient horizontal -sashpad 0 -handlesize 4 set canv .tf.histframe.pwclist.canv
pack .ctop.top.clist -side top -fill both -expand 1 canvas $canv -width $geometry(canv) \
.ctop add .ctop.top
set canv .ctop.top.clist.canv
canvas $canv -height $geometry(canvh) -width $geometry(canv1) \
-background $bgcolor -bd 0 \ -background $bgcolor -bd 0 \
-yscrollincr $linespc -yscrollcommand "scrollcanv $cscroll" -yscrollincr $linespc -yscrollcommand "scrollcanv $cscroll"
.ctop.top.clist add $canv .tf.histframe.pwclist add $canv
set canv2 .ctop.top.clist.canv2 set canv2 .tf.histframe.pwclist.canv2
canvas $canv2 -height $geometry(canvh) -width $geometry(canv2) \ canvas $canv2 -width $geometry(canv2) \
-background $bgcolor -bd 0 -yscrollincr $linespc -background $bgcolor -bd 0 -yscrollincr $linespc
.ctop.top.clist add $canv2 .tf.histframe.pwclist add $canv2
set canv3 .ctop.top.clist.canv3 set canv3 .tf.histframe.pwclist.canv3
canvas $canv3 -height $geometry(canvh) -width $geometry(canv3) \ canvas $canv3 -width $geometry(canv3) \
-background $bgcolor -bd 0 -yscrollincr $linespc -background $bgcolor -bd 0 -yscrollincr $linespc
.ctop.top.clist add $canv3 .tf.histframe.pwclist add $canv3
bind .ctop.top.clist <Configure> {resizeclistpanes %W %w}
lappend bglist $canv $canv2 $canv3
set sha1entry .ctop.top.bar.sha1 # a scroll bar to rule them
scrollbar $cscroll -command {allcanvs yview} -highlightthickness 0
pack $cscroll -side right -fill y
bind .tf.histframe.pwclist <Configure> {resizeclistpanes %W %w}
lappend bglist $canv $canv2 $canv3
pack .tf.histframe.pwclist -fill both -expand 1 -side left
# we have two button bars at bottom of top frame. Bar 1
frame .tf.bar
frame .tf.lbar -height 15
set sha1entry .tf.bar.sha1
set entries $sha1entry set entries $sha1entry
set sha1but .ctop.top.bar.sha1label set sha1but .tf.bar.sha1label
button $sha1but -text "SHA1 ID: " -state disabled -relief flat \ button $sha1but -text "SHA1 ID: " -state disabled -relief flat \
-command gotocommit -width 8 -font $uifont -command gotocommit -width 8 -font $uifont
$sha1but conf -disabledforeground [$sha1but cget -foreground] $sha1but conf -disabledforeground [$sha1but cget -foreground]
pack .ctop.top.bar.sha1label -side left pack .tf.bar.sha1label -side left
entry $sha1entry -width 40 -font $textfont -textvariable sha1string entry $sha1entry -width 40 -font $textfont -textvariable sha1string
trace add variable sha1string write sha1change trace add variable sha1string write sha1change
pack $sha1entry -side left -pady 2 pack $sha1entry -side left -pady 2
@ -505,91 +508,105 @@ proc makewindow {} {
0x00, 0x38, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x00, 0x38, 0x00, 0x1c, 0x00, 0x38, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x00, 0x38, 0x00, 0x1c,
0x00, 0x0e, 0x00, 0x07, 0x80, 0x03, 0xc0, 0x01}; 0x00, 0x0e, 0x00, 0x07, 0x80, 0x03, 0xc0, 0x01};
} }
button .ctop.top.bar.leftbut -image bm-left -command goback \ button .tf.bar.leftbut -image bm-left -command goback \
-state disabled -width 26 -state disabled -width 26
pack .ctop.top.bar.leftbut -side left -fill y pack .tf.bar.leftbut -side left -fill y
button .ctop.top.bar.rightbut -image bm-right -command goforw \ button .tf.bar.rightbut -image bm-right -command goforw \
-state disabled -width 26 -state disabled -width 26
pack .ctop.top.bar.rightbut -side left -fill y pack .tf.bar.rightbut -side left -fill y
button .ctop.top.bar.findbut -text "Find" -command dofind -font $uifont button .tf.bar.findbut -text "Find" -command dofind -font $uifont
pack .ctop.top.bar.findbut -side left pack .tf.bar.findbut -side left
set findstring {} set findstring {}
set fstring .ctop.top.bar.findstring set fstring .tf.bar.findstring
lappend entries $fstring lappend entries $fstring
entry $fstring -width 30 -font $textfont -textvariable findstring entry $fstring -width 30 -font $textfont -textvariable findstring
trace add variable findstring write find_change trace add variable findstring write find_change
pack $fstring -side left -expand 1 -fill x pack $fstring -side left -expand 1 -fill x -in .tf.bar
set findtype Exact set findtype Exact
set findtypemenu [tk_optionMenu .ctop.top.bar.findtype \ set findtypemenu [tk_optionMenu .tf.bar.findtype \
findtype Exact IgnCase Regexp] findtype Exact IgnCase Regexp]
trace add variable findtype write find_change trace add variable findtype write find_change
.ctop.top.bar.findtype configure -font $uifont .tf.bar.findtype configure -font $uifont
.ctop.top.bar.findtype.menu configure -font $uifont .tf.bar.findtype.menu configure -font $uifont
set findloc "All fields" set findloc "All fields"
tk_optionMenu .ctop.top.bar.findloc findloc "All fields" Headline \ tk_optionMenu .tf.bar.findloc findloc "All fields" Headline \
Comments Author Committer Comments Author Committer
trace add variable findloc write find_change trace add variable findloc write find_change
.ctop.top.bar.findloc configure -font $uifont .tf.bar.findloc configure -font $uifont
.ctop.top.bar.findloc.menu configure -font $uifont .tf.bar.findloc.menu configure -font $uifont
pack .ctop.top.bar.findloc -side right pack .tf.bar.findloc -side right
pack .ctop.top.bar.findtype -side right pack .tf.bar.findtype -side right
label .ctop.top.lbar.flabel -text "Highlight: Commits " \ # build up the bottom bar of upper window
-font $uifont label .tf.lbar.flabel -text "Highlight: Commits " \
pack .ctop.top.lbar.flabel -side left -fill y -font $uifont
pack .tf.lbar.flabel -side left -fill y
set gdttype "touching paths:" set gdttype "touching paths:"
set gm [tk_optionMenu .ctop.top.lbar.gdttype gdttype "touching paths:" \ set gm [tk_optionMenu .tf.lbar.gdttype gdttype "touching paths:" \
"adding/removing string:"] "adding/removing string:"]
trace add variable gdttype write hfiles_change trace add variable gdttype write hfiles_change
$gm conf -font $uifont $gm conf -font $uifont
.ctop.top.lbar.gdttype conf -font $uifont .tf.lbar.gdttype conf -font $uifont
pack .ctop.top.lbar.gdttype -side left -fill y pack .tf.lbar.gdttype -side left -fill y
entry .ctop.top.lbar.fent -width 25 -font $textfont \ entry .tf.lbar.fent -width 25 -font $textfont \
-textvariable highlight_files -textvariable highlight_files
trace add variable highlight_files write hfiles_change trace add variable highlight_files write hfiles_change
lappend entries .ctop.top.lbar.fent lappend entries .tf.lbar.fent
pack .ctop.top.lbar.fent -side left -fill x -expand 1 pack .tf.lbar.fent -side left -fill x -expand 1
label .ctop.top.lbar.vlabel -text " OR in view" -font $uifont label .tf.lbar.vlabel -text " OR in view" -font $uifont
pack .ctop.top.lbar.vlabel -side left -fill y pack .tf.lbar.vlabel -side left -fill y
global viewhlmenu selectedhlview global viewhlmenu selectedhlview
set viewhlmenu [tk_optionMenu .ctop.top.lbar.vhl selectedhlview None] set viewhlmenu [tk_optionMenu .tf.lbar.vhl selectedhlview None]
$viewhlmenu entryconf None -command delvhighlight $viewhlmenu entryconf None -command delvhighlight
$viewhlmenu conf -font $uifont $viewhlmenu conf -font $uifont
.ctop.top.lbar.vhl conf -font $uifont .tf.lbar.vhl conf -font $uifont
pack .ctop.top.lbar.vhl -side left -fill y pack .tf.lbar.vhl -side left -fill y
label .ctop.top.lbar.rlabel -text " OR " -font $uifont label .tf.lbar.rlabel -text " OR " -font $uifont
pack .ctop.top.lbar.rlabel -side left -fill y pack .tf.lbar.rlabel -side left -fill y
global highlight_related global highlight_related
set m [tk_optionMenu .ctop.top.lbar.relm highlight_related None \ set m [tk_optionMenu .tf.lbar.relm highlight_related None \
"Descendent" "Not descendent" "Ancestor" "Not ancestor"] "Descendent" "Not descendent" "Ancestor" "Not ancestor"]
$m conf -font $uifont $m conf -font $uifont
.ctop.top.lbar.relm conf -font $uifont .tf.lbar.relm conf -font $uifont
trace add variable highlight_related write vrel_change trace add variable highlight_related write vrel_change
pack .ctop.top.lbar.relm -side left -fill y pack .tf.lbar.relm -side left -fill y
panedwindow .ctop.cdet -orient horizontal # Finish putting the upper half of the viewer together
.ctop add .ctop.cdet pack .tf.lbar -in .tf -side bottom -fill x
frame .ctop.cdet.left pack .tf.bar -in .tf -side bottom -fill x
frame .ctop.cdet.left.bot pack .tf.histframe -fill both -side top -expand 1
pack .ctop.cdet.left.bot -side bottom -fill x .ctop add .tf
button .ctop.cdet.left.bot.search -text "Search" -command dosearch \
# now build up the bottom
panedwindow .pwbottom -orient horizontal
# lower left, a text box over search bar, scroll bar to the right
# if we know window height, then that will set the lower text height, otherwise
# we set lower text height which will drive window height
if {[info exists geometry(main)]} {
frame .bleft -width $geometry(botwidth)
} else {
frame .bleft -width $geometry(botwidth) -height $geometry(botheight)
}
frame .bleft.top
button .bleft.top.search -text "Search" -command dosearch \
-font $uifont -font $uifont
pack .ctop.cdet.left.bot.search -side left -padx 5 pack .bleft.top.search -side left -padx 5
set sstring .ctop.cdet.left.bot.sstring set sstring .bleft.top.sstring
entry $sstring -width 20 -font $textfont -textvariable searchstring entry $sstring -width 20 -font $textfont -textvariable searchstring
lappend entries $sstring lappend entries $sstring
trace add variable searchstring write incrsearch trace add variable searchstring write incrsearch
pack $sstring -side left -expand 1 -fill x pack $sstring -side left -expand 1 -fill x
set ctext .ctop.cdet.left.ctext set ctext .bleft.ctext
text $ctext -background $bgcolor -foreground $fgcolor \ text $ctext -background $bgcolor -foreground $fgcolor \
-state disabled -font $textfont \ -state disabled -font $textfont \
-width $geometry(ctextw) -height $geometry(ctexth) \
-yscrollcommand scrolltext -wrap none -yscrollcommand scrolltext -wrap none
scrollbar .ctop.cdet.left.sb -command "$ctext yview" scrollbar .bleft.sb -command "$ctext yview"
pack .ctop.cdet.left.sb -side right -fill y pack .bleft.top -side top -fill x
pack .bleft.sb -side right -fill y
pack $ctext -side left -fill both -expand 1 pack $ctext -side left -fill both -expand 1
.ctop.cdet add .ctop.cdet.left
lappend bglist $ctext lappend bglist $ctext
lappend fglist $ctext lappend fglist $ctext
@ -620,36 +637,45 @@ proc makewindow {} {
$ctext tag conf msep -font [concat $textfont bold] $ctext tag conf msep -font [concat $textfont bold]
$ctext tag conf found -back yellow $ctext tag conf found -back yellow
frame .ctop.cdet.right .pwbottom add .bleft
frame .ctop.cdet.right.mode
radiobutton .ctop.cdet.right.mode.patch -text "Patch" \ # lower right
frame .bright
frame .bright.mode
radiobutton .bright.mode.patch -text "Patch" \
-command reselectline -variable cmitmode -value "patch" -command reselectline -variable cmitmode -value "patch"
radiobutton .ctop.cdet.right.mode.tree -text "Tree" \ radiobutton .bright.mode.tree -text "Tree" \
-command reselectline -variable cmitmode -value "tree" -command reselectline -variable cmitmode -value "tree"
grid .ctop.cdet.right.mode.patch .ctop.cdet.right.mode.tree -sticky ew grid .bright.mode.patch .bright.mode.tree -sticky ew
pack .ctop.cdet.right.mode -side top -fill x pack .bright.mode -side top -fill x
set cflist .ctop.cdet.right.cfiles set cflist .bright.cfiles
set indent [font measure $mainfont "nn"] set indent [font measure $mainfont "nn"]
text $cflist -width $geometry(cflistw) \ text $cflist \
-background $bgcolor -foreground $fgcolor \ -background $bgcolor -foreground $fgcolor \
-font $mainfont \ -font $mainfont \
-tabs [list $indent [expr {2 * $indent}]] \ -tabs [list $indent [expr {2 * $indent}]] \
-yscrollcommand ".ctop.cdet.right.sb set" \ -yscrollcommand ".bright.sb set" \
-cursor [. cget -cursor] \ -cursor [. cget -cursor] \
-spacing1 1 -spacing3 1 -spacing1 1 -spacing3 1
lappend bglist $cflist lappend bglist $cflist
lappend fglist $cflist lappend fglist $cflist
scrollbar .ctop.cdet.right.sb -command "$cflist yview" scrollbar .bright.sb -command "$cflist yview"
pack .ctop.cdet.right.sb -side right -fill y pack .bright.sb -side right -fill y
pack $cflist -side left -fill both -expand 1 pack $cflist -side left -fill both -expand 1
$cflist tag configure highlight \ $cflist tag configure highlight \
-background [$cflist cget -selectbackground] -background [$cflist cget -selectbackground]
$cflist tag configure bold -font [concat $mainfont bold] $cflist tag configure bold -font [concat $mainfont bold]
.ctop.cdet add .ctop.cdet.right
bind .ctop.cdet <Configure> {resizecdetpanes %W %w}
pack .ctop -side top -fill both -expand 1 .pwbottom add .bright
.ctop add .pwbottom
# restore window position if known
if {[info exists geometry(main)]} {
wm geometry . "$geometry(main)"
}
bind .pwbottom <Configure> {resizecdetpanes %W %w}
pack .ctop -fill both -expand 1
bindall <1> {selcanvline %W %x %y} bindall <1> {selcanvline %W %x %y}
#bindall <B1-Motion> {selcanvline %W %x %y} #bindall <B1-Motion> {selcanvline %W %x %y}
bindall <ButtonRelease-4> "allcanvs yview scroll -5 units" bindall <ButtonRelease-4> "allcanvs yview scroll -5 units"
@ -802,18 +828,16 @@ proc savestuff {w} {
puts $f [list set fgcolor $fgcolor] puts $f [list set fgcolor $fgcolor]
puts $f [list set colors $colors] puts $f [list set colors $colors]
puts $f [list set diffcolors $diffcolors] puts $f [list set diffcolors $diffcolors]
puts $f "set geometry(width) [winfo width .ctop]"
puts $f "set geometry(height) [winfo height .ctop]" puts $f "set geometry(main) [winfo geometry .]"
puts $f "set geometry(canv1) [expr {[winfo width $canv]-2}]" puts $f "set geometry(topwidth) [winfo width .tf]"
puts $f "set geometry(canv2) [expr {[winfo width $canv2]-2}]" puts $f "set geometry(topheight) [winfo height .tf]"
puts $f "set geometry(canv3) [expr {[winfo width $canv3]-2}]" puts $f "set geometry(canv) [expr {[winfo width $canv]-0}]"
puts $f "set geometry(canvh) [expr {[winfo height $canv]-2}]" puts $f "set geometry(canv2) [expr {[winfo width $canv2]-0}]"
set wid [expr {([winfo width $ctext] - 8) \ puts $f "set geometry(canv3) [expr {[winfo width $canv3]-0}]"
/ [font measure $textfont "0"]}] puts $f "set geometry(botwidth) [winfo width .bleft]"
puts $f "set geometry(ctextw) $wid" puts $f "set geometry(botheight) [winfo height .bleft]"
set wid [expr {([winfo width $cflist] - 11) \
/ [font measure [$cflist cget -font] "0"]}]
puts $f "set geometry(cflistw) $wid"
puts -nonewline $f "set permviews {" puts -nonewline $f "set permviews {"
for {set v 0} {$v < $nextviewnum} {incr v} { for {set v 0} {$v < $nextviewnum} {incr v} {
if {$viewperm($v)} { if {$viewperm($v)} {
@ -4043,11 +4067,11 @@ proc addtohistory {cmd} {
} }
incr historyindex incr historyindex
if {$historyindex > 1} { if {$historyindex > 1} {
.ctop.top.bar.leftbut conf -state normal .tf.bar.leftbut conf -state normal
} else { } else {
.ctop.top.bar.leftbut conf -state disabled .tf.bar.leftbut conf -state disabled
} }
.ctop.top.bar.rightbut conf -state disabled .tf.bar.rightbut conf -state disabled
} }
proc godo {elt} { proc godo {elt} {
@ -4067,10 +4091,10 @@ proc goback {} {
if {$historyindex > 1} { if {$historyindex > 1} {
incr historyindex -1 incr historyindex -1
godo [lindex $history [expr {$historyindex - 1}]] godo [lindex $history [expr {$historyindex - 1}]]
.ctop.top.bar.rightbut conf -state normal .tf.bar.rightbut conf -state normal
} }
if {$historyindex <= 1} { if {$historyindex <= 1} {
.ctop.top.bar.leftbut conf -state disabled .tf.bar.leftbut conf -state disabled
} }
} }
@ -4081,10 +4105,10 @@ proc goforw {} {
set cmd [lindex $history $historyindex] set cmd [lindex $history $historyindex]
incr historyindex incr historyindex
godo $cmd godo $cmd
.ctop.top.bar.leftbut conf -state normal .tf.bar.leftbut conf -state normal
} }
if {$historyindex >= [llength $history]} { if {$historyindex >= [llength $history]} {
.ctop.top.bar.rightbut conf -state disabled .tf.bar.rightbut conf -state disabled
} }
} }
@ -4591,7 +4615,7 @@ proc searchmarkvisible {doall} {
proc scrolltext {f0 f1} { proc scrolltext {f0 f1} {
global searchstring global searchstring
.ctop.cdet.left.sb set $f0 $f1 .bleft.sb set $f0 $f1
if {$searchstring ne {}} { if {$searchstring ne {}} {
searchmarkvisible 0 searchmarkvisible 0
} }