{"thread":{"id":"6595","subject":"[PATCH] Make gitk work reasonably well on Cygwin.","startedAt":"2007-01-31T14:50:34Z","lastAt":"2007-02-01T19:24:32Z","messageCount":23,"participants":["Mike Nefari","Johannes Schindelin","Mark Levedahl","Johannes Sixt","Alex Riesen","Junio C Hamano","Seth Falcon","Christian MICHON","Shawn O. Pearce"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"33137","messageId":"BAY13-F213DF79906B3889D42369D0A50@phx.gbl","threadId":"6595","inReplyTo":null,"subject":"[PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Mike Nefari","fromEmail":"fastestspinner@hotmail.com","sentAt":"2007-01-31T14:50:34Z","receivedAt":"2007-01-31T14:50:34Z","isPatch":true,"sender":{"key":"fastestspinner@hotmail.com","avatar":null},"body":"The gitk gui layout was completely broken on Cygwin. If gitk was started\nwithout previous geometry in ~/.gitk, the user could drag the window sashes\nto get a useable layout. However, if ~/.gitk existed, this was not possible\nat all.\n\nThe fix was to rewrite makewindow, changing the toplevel containers and\nthe particular geometry information saved between sessions. Numerous bugs\nin both the Cygwin and the Linux Tk versions make this a delicate\nbalancing act: the version here works in both but many subtle variants\nare competely broken in one or the other environment.\n\nThree user visible changes result:\n1 - The viewer is fully functional under Cygwin.\n2 - The search bar moves from the bottom to the top of the lower left\n    pane. This was necessary to get around a layout problem on Cygwin.\n3 - The window size and position is saved and restored between sessions.\n    Again, this is necessary to get around a layout problem on Cygwin.\n\nSigned-off-by: Mark Levedahl <fastestspinner@hotmail.com>\n---\ngitk |  282 \n++++++++++++++++++++++++++++++++++++------------------------------\n1 files changed, 154 insertions(+), 128 deletions(-)\n\ndiff --git a/gitk b/gitk\nindex 31d0aad..8aadf5a 100755\n--- a/gitk\n+++ b/gitk\n@@ -427,7 +427,7 @@ proc makewindow {} {\n     .bar.view add separator\n     .bar.view add radiobutton -label \"All files\" -command {showview 0} \\\n\t-variable selectedview -value 0\n-\n+\n     menu .bar.help\n     .bar add cascade -label \"Help\" -menu .bar.help\n     .bar.help add command -label \"About gitk\" -command about\n@@ -435,56 +435,59 @@ proc makewindow {} {\n     .bar.help configure -font $uifont\n     . configure -menu .bar\n\n-    if {![info exists geometry(canv1)]} {\n-\tset geometry(canv1) [expr {45 * $charspc}]\n-\tset geometry(canv2) [expr {30 * $charspc}]\n-\tset geometry(canv3) [expr {15 * $charspc}]\n-\tset geometry(canvh) [expr {25 * $linespc + 4}]\n-\tset geometry(ctextw) 80\n-\tset geometry(ctexth) 30\n-\tset geometry(cflistw) 30\n-    }\n+    # the gui has upper and lower half, parts of a paned window.\n     panedwindow .ctop -orient vertical\n-    if {[info exists geometry(width)]} {\n-\t.ctop conf -width $geometry(width) -height $geometry(height)\n-\tset texth [expr {$geometry(height) - $geometry(canvh) - 56}]\n-\tset geometry(ctexth) [expr {($texth - 8) /\n-\t\t\t\t    [font metrics $textfont -linespace]}]\n-    }\n-    frame .ctop.top\n-    frame .ctop.top.bar\n-    frame .ctop.top.lbar\n-    pack .ctop.top.lbar -side bottom -fill x\n-    pack .ctop.top.bar -side bottom -fill x\n-    set cscroll .ctop.top.csb\n-    scrollbar $cscroll -command {allcanvs yview} -highlightthickness 0\n-    pack $cscroll -side right -fill y\n-    panedwindow .ctop.top.clist -orient horizontal -sashpad 0 -handlesize 4\n-    pack .ctop.top.clist -side top -fill both -expand 1\n-    .ctop add .ctop.top\n-    set canv .ctop.top.clist.canv\n-    canvas $canv -height $geometry(canvh) -width $geometry(canv1) \\\n+\n+    # possibly use assumed geometry\n+    if {![info exists geometry(topheight)]} {\n+        set geometry(topheight) [expr {15 * $linespc}]\n+        set geometry(topwidth) [expr {100 * $charspc}]\n+        set geometry(botheight) [expr {30 * $linespc}]\n+        set geometry(botwidth) [expr {70 * $charspc}]\n+        set geometry(canv) [expr {50 * $charspc}]\n+        set geometry(canv2) [expr {30 * $charspc}]\n+        set geometry(canv3) [expr {20 * $charspc}]\n+    }\n+\n+    # the upper half will have a paned window, a scroll bar to the right, \nand some stuff below\n+    frame .tf -height $geometry(topheight) -width $geometry(topwidth)\n+    frame .tf.histframe\n+    panedwindow .tf.histframe.pwclist -orient horizontal -sashpad 0 \n-handlesize 4\n+\n+    # create three canvases\n+    set cscroll .tf.histframe.csb\n+    set canv .tf.histframe.pwclist.canv\n+    canvas $canv -width $geometry(canv) \\\n\t-background $bgcolor -bd 0 \\\n\t-yscrollincr $linespc -yscrollcommand \"scrollcanv $cscroll\"\n-    .ctop.top.clist add $canv\n-    set canv2 .ctop.top.clist.canv2\n-    canvas $canv2 -height $geometry(canvh) -width $geometry(canv2) \\\n+    .tf.histframe.pwclist add $canv\n+    set canv2 .tf.histframe.pwclist.canv2\n+    canvas $canv2 -width $geometry(canv2) \\\n\t-background $bgcolor -bd 0 -yscrollincr $linespc\n-    .ctop.top.clist add $canv2\n-    set canv3 .ctop.top.clist.canv3\n-    canvas $canv3 -height $geometry(canvh) -width $geometry(canv3) \\\n+    .tf.histframe.pwclist add $canv2\n+    set canv3 .tf.histframe.pwclist.canv3\n+    canvas $canv3 -width $geometry(canv3) \\\n\t-background $bgcolor -bd 0 -yscrollincr $linespc\n-    .ctop.top.clist add $canv3\n-    bind .ctop.top.clist <Configure> {resizeclistpanes %W %w}\n+    .tf.histframe.pwclist add $canv3\n+\n+    # a scroll bar to rule them\n+    scrollbar $cscroll -command {allcanvs yview} -highlightthickness 0\n+    pack $cscroll -side right -fill y\n+    bind .tf.histframe.pwclist <Configure> {resizeclistpanes %W %w}\n     lappend bglist $canv $canv2 $canv3\n+    pack .tf.histframe.pwclist -fill both -expand 1 -side left\n+\n+    # we have two button bars at bottom of top frame. Bar 1\n+    frame .tf.bar\n+    frame .tf.lbar -height 15\n\n-    set sha1entry .ctop.top.bar.sha1\n+    set sha1entry .tf.bar.sha1\n     set entries $sha1entry\n-    set sha1but .ctop.top.bar.sha1label\n+    set sha1but .tf.bar.sha1label\n     button $sha1but -text \"SHA1 ID: \" -state disabled -relief flat \\\n\t-command gotocommit -width 8 -font $uifont\n     $sha1but conf -disabledforeground [$sha1but cget -foreground]\n-    pack .ctop.top.bar.sha1label -side left\n+    pack .tf.bar.sha1label -side left\n     entry $sha1entry -width 40 -font $textfont -textvariable sha1string\n     trace add variable sha1string write sha1change\n     pack $sha1entry -side left -pady 2\n@@ -505,91 +508,107 @@ proc makewindow {} {\n\t0x00, 0x38, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x00, 0x38, 0x00, 0x1c,\n\t0x00, 0x0e, 0x00, 0x07, 0x80, 0x03, 0xc0, 0x01};\n     }\n-    button .ctop.top.bar.leftbut -image bm-left -command goback \\\n+    button .tf.bar.leftbut -image bm-left -command goback \\\n\t-state disabled -width 26\n-    pack .ctop.top.bar.leftbut -side left -fill y\n-    button .ctop.top.bar.rightbut -image bm-right -command goforw \\\n+    pack .tf.bar.leftbut -side left -fill y\n+    button .tf.bar.rightbut -image bm-right -command goforw \\\n\t-state disabled -width 26\n-    pack .ctop.top.bar.rightbut -side left -fill y\n+    pack .tf.bar.rightbut -side left -fill y\n\n-    button .ctop.top.bar.findbut -text \"Find\" -command dofind -font $uifont\n-    pack .ctop.top.bar.findbut -side left\n+    button .tf.bar.findbut -text \"Find\" -command dofind -font $uifont\n+    pack .tf.bar.findbut -side left\n     set findstring {}\n-    set fstring .ctop.top.bar.findstring\n+    set fstring .tf.bar.findstring\n     lappend entries $fstring\n     entry $fstring -width 30 -font $textfont -textvariable findstring\n     trace add variable findstring write find_change\n-    pack $fstring -side left -expand 1 -fill x\n+    pack $fstring -side left -expand 1 -fill x -in .tf.bar\n     set findtype Exact\n-    set findtypemenu [tk_optionMenu .ctop.top.bar.findtype \\\n-\t\t\t  findtype Exact IgnCase Regexp]\n+    set findtypemenu [tk_optionMenu .tf.bar.findtype \\\n+\t\t      findtype Exact IgnCase Regexp]\n     trace add variable findtype write find_change\n-    .ctop.top.bar.findtype configure -font $uifont\n-    .ctop.top.bar.findtype.menu configure -font $uifont\n+    .tf.bar.findtype configure -font $uifont\n+    .tf.bar.findtype.menu configure -font $uifont\n     set findloc \"All fields\"\n-    tk_optionMenu .ctop.top.bar.findloc findloc \"All fields\" Headline \\\n+    tk_optionMenu .tf.bar.findloc findloc \"All fields\" Headline \\\n\tComments Author Committer\n     trace add variable findloc write find_change\n-    .ctop.top.bar.findloc configure -font $uifont\n-    .ctop.top.bar.findloc.menu configure -font $uifont\n-    pack .ctop.top.bar.findloc -side right\n-    pack .ctop.top.bar.findtype -side right\n+    .tf.bar.findloc configure -font $uifont\n+    .tf.bar.findloc.menu configure -font $uifont\n+    pack .tf.bar.findloc -side right\n+    pack .tf.bar.findtype -side right\n\n-    label .ctop.top.lbar.flabel -text \"Highlight:  Commits \" \\\n-\t-font $uifont\n-    pack .ctop.top.lbar.flabel -side left -fill y\n+    #-----------------\n+\n+    # build up the bottom bar of upper window\n+    label .tf.lbar.flabel -text \"Highlight:  Commits \" \\\n+    -font $uifont\n+    pack .tf.lbar.flabel -side left -fill y\n     set gdttype \"touching paths:\"\n-    set gm [tk_optionMenu .ctop.top.lbar.gdttype gdttype \"touching paths:\" \n\\\n-\t\t\"adding/removing string:\"]\n+    set gm [tk_optionMenu .tf.lbar.gdttype gdttype \"touching paths:\" \\\n+\t\"adding/removing string:\"]\n     trace add variable gdttype write hfiles_change\n     $gm conf -font $uifont\n-    .ctop.top.lbar.gdttype conf -font $uifont\n-    pack .ctop.top.lbar.gdttype -side left -fill y\n-    entry .ctop.top.lbar.fent -width 25 -font $textfont \\\n+    .tf.lbar.gdttype conf -font $uifont\n+    pack .tf.lbar.gdttype -side left -fill y\n+    entry .tf.lbar.fent -width 25 -font $textfont \\\n\t-textvariable highlight_files\n     trace add variable highlight_files write hfiles_change\n-    lappend entries .ctop.top.lbar.fent\n-    pack .ctop.top.lbar.fent -side left -fill x -expand 1\n-    label .ctop.top.lbar.vlabel -text \" OR in view\" -font $uifont\n-    pack .ctop.top.lbar.vlabel -side left -fill y\n+    lappend entries .tf.lbar.fent\n+    pack .tf.lbar.fent -side left -fill x -expand 1\n+    label .tf.lbar.vlabel -text \" OR in view\" -font $uifont\n+    pack .tf.lbar.vlabel -side left -fill y\n     global viewhlmenu selectedhlview\n-    set viewhlmenu [tk_optionMenu .ctop.top.lbar.vhl selectedhlview None]\n+    set viewhlmenu [tk_optionMenu .tf.lbar.vhl selectedhlview None]\n     $viewhlmenu entryconf None -command delvhighlight\n     $viewhlmenu conf -font $uifont\n-    .ctop.top.lbar.vhl conf -font $uifont\n-    pack .ctop.top.lbar.vhl -side left -fill y\n-    label .ctop.top.lbar.rlabel -text \" OR \" -font $uifont\n-    pack .ctop.top.lbar.rlabel -side left -fill y\n+    .tf.lbar.vhl conf -font $uifont\n+    pack .tf.lbar.vhl -side left -fill y\n+    label .tf.lbar.rlabel -text \" OR \" -font $uifont\n+    pack .tf.lbar.rlabel -side left -fill y\n     global highlight_related\n-    set m [tk_optionMenu .ctop.top.lbar.relm highlight_related None \\\n-\t       \"Descendent\" \"Not descendent\" \"Ancestor\" \"Not ancestor\"]\n+    set m [tk_optionMenu .tf.lbar.relm highlight_related None \\\n+\t\"Descendent\" \"Not descendent\" \"Ancestor\" \"Not ancestor\"]\n     $m conf -font $uifont\n-    .ctop.top.lbar.relm conf -font $uifont\n+    .tf.lbar.relm conf -font $uifont\n     trace add variable highlight_related write vrel_change\n-    pack .ctop.top.lbar.relm -side left -fill y\n-\n-    panedwindow .ctop.cdet -orient horizontal\n-    .ctop add .ctop.cdet\n-    frame .ctop.cdet.left\n-    frame .ctop.cdet.left.bot\n-    pack .ctop.cdet.left.bot -side bottom -fill x\n-    button .ctop.cdet.left.bot.search -text \"Search\" -command dosearch \\\n+    pack .tf.lbar.relm -side left -fill y\n+\n+    # Finish putting the upper half of the viewer together\n+    pack .tf.lbar -in .tf -side bottom -fill x\n+    pack .tf.bar -in .tf -side bottom -fill x\n+    pack .tf.histframe -fill both -side top -expand 1\n+    .ctop add .tf\n+\n+    # now build up the bottom\n+    panedwindow .pwbottom -orient horizontal\n+\n+    # lower left, a text box over search bar, scroll bar to the right\n+    # if we know window height, then that will set the lower text height, \notherwise\n+    # we set lower text height which will drive window height\n+    if {[info exists geometry(main)]} {\n+        frame .bleft -width $geometry(botwidth)\n+    } else {\n+        frame .bleft -width $geometry(botwidth) -height \n$geometry(botheight)\n+    }\n+    frame .bleft.top\n+\n+    button .bleft.top.search -text \"Search\" -command dosearch \\\n\t-font $uifont\n-    pack .ctop.cdet.left.bot.search -side left -padx 5\n-    set sstring .ctop.cdet.left.bot.sstring\n+    pack .bleft.top.search -side left -padx 5\n+    set sstring .bleft.top.sstring\n     entry $sstring -width 20 -font $textfont -textvariable searchstring\n     lappend entries $sstring\n     trace add variable searchstring write incrsearch\n     pack $sstring -side left -expand 1 -fill x\n-    set ctext .ctop.cdet.left.ctext\n+    set ctext .bleft.ctext\n     text $ctext -background $bgcolor -foreground $fgcolor \\\n\t-state disabled -font $textfont \\\n-\t-width $geometry(ctextw) -height $geometry(ctexth) \\\n\t-yscrollcommand scrolltext -wrap none\n-    scrollbar .ctop.cdet.left.sb -command \"$ctext yview\"\n-    pack .ctop.cdet.left.sb -side right -fill y\n+    scrollbar .bleft.sb -command \"$ctext yview\"\n+    pack .bleft.top -side top -fill x\n+    pack .bleft.sb -side right -fill y\n     pack $ctext -side left -fill both -expand 1\n-    .ctop.cdet add .ctop.cdet.left\n     lappend bglist $ctext\n     lappend fglist $ctext\n\n@@ -620,36 +639,45 @@ proc makewindow {} {\n     $ctext tag conf msep -font [concat $textfont bold]\n     $ctext tag conf found -back yellow\n\n-    frame .ctop.cdet.right\n-    frame .ctop.cdet.right.mode\n-    radiobutton .ctop.cdet.right.mode.patch -text \"Patch\" \\\n+    .pwbottom add .bleft\n+\n+    # lower right\n+    frame .bright\n+    frame .bright.mode\n+    radiobutton .bright.mode.patch -text \"Patch\" \\\n\t-command reselectline -variable cmitmode -value \"patch\"\n-    radiobutton .ctop.cdet.right.mode.tree -text \"Tree\" \\\n+    radiobutton .bright.mode.tree -text \"Tree\" \\\n\t-command reselectline -variable cmitmode -value \"tree\"\n-    grid .ctop.cdet.right.mode.patch .ctop.cdet.right.mode.tree -sticky ew\n-    pack .ctop.cdet.right.mode -side top -fill x\n-    set cflist .ctop.cdet.right.cfiles\n+    grid .bright.mode.patch .bright.mode.tree -sticky ew\n+    pack .bright.mode -side top -fill x\n+    set cflist .bright.cfiles\n     set indent [font measure $mainfont \"nn\"]\n-    text $cflist -width $geometry(cflistw) \\\n+    text $cflist \\\n\t-background $bgcolor -foreground $fgcolor \\\n\t-font $mainfont \\\n\t-tabs [list $indent [expr {2 * $indent}]] \\\n-\t-yscrollcommand \".ctop.cdet.right.sb set\" \\\n+\t-yscrollcommand \".bright.sb set\" \\\n\t-cursor [. cget -cursor] \\\n\t-spacing1 1 -spacing3 1\n     lappend bglist $cflist\n     lappend fglist $cflist\n-    scrollbar .ctop.cdet.right.sb -command \"$cflist yview\"\n-    pack .ctop.cdet.right.sb -side right -fill y\n+    scrollbar .bright.sb -command \"$cflist yview\"\n+    pack .bright.sb -side right -fill y\n     pack $cflist -side left -fill both -expand 1\n     $cflist tag configure highlight \\\n\t-background [$cflist cget -selectbackground]\n     $cflist tag configure bold -font [concat $mainfont bold]\n-    .ctop.cdet add .ctop.cdet.right\n-    bind .ctop.cdet <Configure> {resizecdetpanes %W %w}\n\n-    pack .ctop -side top -fill both -expand 1\n+    .pwbottom add .bright\n+    .ctop add .pwbottom\n+\n+    # restore window position if known\n+    if {[info exists geometry(main)]} {\n+        wm geometry . \"$geometry(main)\"\n+    }\n\n+    bind .pwbottom <Configure> {resizecdetpanes %W %w}\n+    pack .ctop -fill both -expand 1\n     bindall <1> {selcanvline %W %x %y}\n     #bindall <B1-Motion> {selcanvline %W %x %y}\n     bindall <ButtonRelease-4> \"allcanvs yview scroll -5 units\"\n@@ -802,18 +830,16 @@ proc savestuff {w} {\n\tputs $f [list set fgcolor $fgcolor]\n\tputs $f [list set colors $colors]\n\tputs $f [list set diffcolors $diffcolors]\n-\tputs $f \"set geometry(width) [winfo width .ctop]\"\n-\tputs $f \"set geometry(height) [winfo height .ctop]\"\n-\tputs $f \"set geometry(canv1) [expr {[winfo width $canv]-2}]\"\n-\tputs $f \"set geometry(canv2) [expr {[winfo width $canv2]-2}]\"\n-\tputs $f \"set geometry(canv3) [expr {[winfo width $canv3]-2}]\"\n-\tputs $f \"set geometry(canvh) [expr {[winfo height $canv]-2}]\"\n-\tset wid [expr {([winfo width $ctext] - 8) \\\n-\t\t\t   / [font measure $textfont \"0\"]}]\n-\tputs $f \"set geometry(ctextw) $wid\"\n-\tset wid [expr {([winfo width $cflist] - 11) \\\n-\t\t\t   / [font measure [$cflist cget -font] \"0\"]}]\n-\tputs $f \"set geometry(cflistw) $wid\"\n+\n+        puts $f \"set geometry(main) [winfo geometry .]\"\n+\tputs $f \"set geometry(topwidth) [winfo width .tf]\"\n+\tputs $f \"set geometry(topheight) [winfo height .tf]\"\n+\tputs $f \"set geometry(canv) [expr {[winfo width $canv]-0}]\"\n+\tputs $f \"set geometry(canv2) [expr {[winfo width $canv2]-0}]\"\n+\tputs $f \"set geometry(canv3) [expr {[winfo width $canv3]-0}]\"\n+\tputs $f \"set geometry(botwidth) [winfo width .bleft]\"\n+\tputs $f \"set geometry(botheight) [winfo height .bleft]\"\n+\n\tputs -nonewline $f \"set permviews {\"\n\tfor {set v 0} {$v < $nextviewnum} {incr v} {\n\t    if {$viewperm($v)} {\n@@ -1402,7 +1428,7 @@ proc newview {ishighlight} {\n     set newviewname($nextviewnum) \"View $nextviewnum\"\n     set newviewperm($nextviewnum) 0\n     set newviewargs($nextviewnum) [shellarglist $revtreeargs]\n-    vieweditor $top $nextviewnum \"Gitk view definition\"\n+    vieweditor $top $nextviewnum \"Gitk view definition\"\n}\n\nproc editview {} {\n@@ -3897,7 +3923,7 @@ proc selectline {l isnew} {\n\t}\n\t$ctext insert end \"\\n\"\n     }\n-\n+\n     set headers {}\n     set olds [lindex $parentlist $l]\n     if {[llength $olds] > 1} {\n@@ -4006,7 +4032,7 @@ proc selnextpage {dir} {\n         set l [expr $numcommits - 1]\n     }\n     unmarkmatches\n-    selectline $l 1\n+    selectline $l 1\n}\n\nproc unselectline {} {\n@@ -4043,11 +4069,11 @@ proc addtohistory {cmd} {\n     }\n     incr historyindex\n     if {$historyindex > 1} {\n-\t.ctop.top.bar.leftbut conf -state normal\n+\t.tf.bar.leftbut conf -state normal\n     } else {\n-\t.ctop.top.bar.leftbut conf -state disabled\n+\t.tf.bar.leftbut conf -state disabled\n     }\n-    .ctop.top.bar.rightbut conf -state disabled\n+    .tf.bar.rightbut conf -state disabled\n}\n\nproc godo {elt} {\n@@ -4070,7 +4096,7 @@ proc goback {} {\n\t.ctop.top.bar.rightbut conf -state normal\n     }\n     if {$historyindex <= 1} {\n-\t.ctop.top.bar.leftbut conf -state disabled\n+\t.tf.bar.leftbut conf -state disabled\n     }\n}\n\n@@ -4081,10 +4107,10 @@ proc goforw {} {\n\tset cmd [lindex $history $historyindex]\n\tincr historyindex\n\tgodo $cmd\n-\t.ctop.top.bar.leftbut conf -state normal\n+\t.tf.bar.leftbut conf -state normal\n     }\n     if {$historyindex >= [llength $history]} {\n-\t.ctop.top.bar.rightbut conf -state disabled\n+\t.tf.bar.rightbut conf -state disabled\n     }\n}\n\n@@ -4591,7 +4617,7 @@ proc searchmarkvisible {doall} {\nproc scrolltext {f0 f1} {\n     global searchstring\n\n-    .ctop.cdet.left.sb set $f0 $f1\n+    .bleft.sb set $f0 $f1\n     if {$searchstring ne {}} {\n\tsearchmarkvisible 0\n     }\n--\n1.5.0.rc2.76.g4fc0-dirty\n\n_________________________________________________________________\nSearch for grocery stores. Find gratitude. Turn a simple search into \nsomething more. \nhttp://click4thecause.live.com/search/charity/default.aspx?source=hmemtagline_gratitude&FORM=WLMTAG\n"},{"id":"33140","messageId":"Pine.LNX.4.63.0701311612420.22628@wbgn013.biozentrum.uni-wuerzburg.de","threadId":"6595","inReplyTo":"BAY13-F213DF79906B3889D42369D0A50@phx.gbl","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2007-01-31T15:17:17Z","receivedAt":"2007-01-31T15:17:17Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Wed, 31 Jan 2007, Mike Nefari wrote:\n\n> The gitk gui layout was completely broken on Cygwin.\n\nThis was noted before. I tried to argue with Paulus (now Cc'ed, as per \nSubmittingPatches) that he should include it in gitk. Somehow this did not \nhave the effect intended be me.\n\nI also verified that with my Tcl/Tk installation on MacOSX, a patch like \nthis was needed. IIRC Paulus argued that I should get a native TclTk, \nwhich is supposed to work (though not with the paths on Cygwin, oh well).\n\nOh, and it is also needed for MinGW. But I guess it will remain unfixed.\n\n> gitk |  282 ++++++++++++++++++++++++++++++++++++------------------------------\n> 1 files changed, 154 insertions(+), 128 deletions(-)\n\nFWIW my patch is less intrusive:\n\n gitk |   22 ++++++++++++++++++----\n 1 files changed, 18 insertions(+), 4 deletions(-)\n\ndiff --git a/gitk b/gitk\nindex 31d0aad..d3dc8f1 100755\n--- a/gitk\n+++ b/gitk\n@@ -451,7 +451,10 @@ proc makewindow {} {\n \tset geometry(ctexth) [expr {($texth - 8) /\n \t\t\t\t    [font metrics $textfont -linespace]}]\n     }\n-    frame .ctop.top\n+    if {![info exists geometry(ctoptoph)]} {\n+\tset geometry(ctoptoph) [expr $geometry(canvh)+34]\n+    }\n+    frame .ctop.top -height $geometry(ctoptoph)\n     frame .ctop.top.bar\n     frame .ctop.top.lbar\n     pack .ctop.top.lbar -side bottom -fill x\n@@ -459,7 +462,7 @@ proc makewindow {} {\n     set cscroll .ctop.top.csb\n     scrollbar $cscroll -command {allcanvs yview} -highlightthickness 0\n     pack $cscroll -side right -fill y\n-    panedwindow .ctop.top.clist -orient horizontal -sashpad 0 -handlesize 4\n+    panedwindow .ctop.top.clist -orient horizontal -sashpad 0 -handlesize 4 -height $geometry(canvh)\n     pack .ctop.top.clist -side top -fill both -expand 1\n     .ctop add .ctop.top\n     set canv .ctop.top.clist.canv\n@@ -568,9 +571,17 @@ proc makewindow {} {\n     trace add variable highlight_related write vrel_change\n     pack .ctop.top.lbar.relm -side left -fill y\n \n-    panedwindow .ctop.cdet -orient horizontal\n+    if {![info exists geometry(cdeth)]} {\n+\tset geometry(cdeth) \\\n+\t    [expr $geometry(ctexth)*[font metrics $textfont -linespace]+4]\n+    }\n+    panedwindow .ctop.cdet -orient horizontal -height $geometry(cdeth)\n     .ctop add .ctop.cdet\n-    frame .ctop.cdet.left\n+    if {![info exists geometry(cdetleftw)]} {\n+\tset geometry(cdetleftw) \\\n+\t    [expr $geometry(ctextw)*[font measure $textfont \"0\"]+8] \n+    }\n+    frame .ctop.cdet.left -width $geometry(cdetleftw)\n     frame .ctop.cdet.left.bot\n     pack .ctop.cdet.left.bot -side bottom -fill x\n     button .ctop.cdet.left.bot.search -text \"Search\" -command dosearch \\\n@@ -814,6 +825,9 @@ proc savestuff {w} {\n \tset wid [expr {([winfo width $cflist] - 11) \\\n \t\t\t   / [font measure [$cflist cget -font] \"0\"]}]\n \tputs $f \"set geometry(cflistw) $wid\"\n+\tputs $f \"set geometry(ctoptoph) [winfo height .ctop.top]\"\n+\tputs $f \"set geometry(cdeth) [winfo height .ctop.cdet]\"\n+\tputs $f \"set geometry(cdetleftw) [winfo width .ctop.cdet.left]\"\n \tputs -nonewline $f \"set permviews {\"\n \tfor {set v 0} {$v < $nextviewnum} {incr v} {\n \t    if {$viewperm($v)} {\n"},{"id":"33145","messageId":"BAY13-F166A2E33293EA2B17FAB3CD0A50@phx.gbl","threadId":"6595","inReplyTo":"Pine.LNX.4.63.0701311612420.22628@wbgn013.biozentrum.uni-wuerzburg.de","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Mark Levedahl","fromEmail":"fastestspinner@hotmail.com","sentAt":"2007-01-31T16:00:04Z","receivedAt":"2007-01-31T16:00:04Z","isPatch":true,"sender":{"key":"fastestspinner@hotmail.com","avatar":null},"body":"The current gitk is completely broken on Windows using the current Active \nState Tcl/Tk release as well: the display is very similar to what is shown \non cygwin. The basic problem seems to be that Tk's geometry manager is \nbuggy, on all platforms, not just cygwin. I found many variations of the \ngitk layout that broke on Linux in similar ways to the breakage on cygwin on \nmy way to creating this patch (including ones that worked on Cygwin/Windows \nbut not on Linux). So, arguments to the effect of \"get the native Tcl/Tk\" or \n\"update Cygwin's Tcl/Tk, the old one is broken\" just don't hold up.\n\nMark Levedahl\n\n\n>From: Johannes Schindelin <Johannes.Schindelin@gmx.de>\n>To: Mike Nefari <fastestspinner@hotmail.com>\n>CC: git@vger.kernel.org, Paul Mackerras <paulus@samba.org>\n>Subject: Re: [PATCH] Make gitk work reasonably well on Cygwin.\n>Date: Wed, 31 Jan 2007 16:17:17 +0100 (CET)\n>\n>Hi,\n>\n>On Wed, 31 Jan 2007, Mike Nefari wrote:\n>\n> > The gitk gui layout was completely broken on Cygwin.\n>\n>This was noted before. I tried to argue with Paulus (now Cc'ed, as per\n>SubmittingPatches) that he should include it in gitk. Somehow this did not\n>have the effect intended be me.\n>\n>I also verified that with my Tcl/Tk installation on MacOSX, a patch like\n>this was needed. IIRC Paulus argued that I should get a native TclTk,\n>which is supposed to work (though not with the paths on Cygwin, oh well).\n>\n>Oh, and it is also needed for MinGW. But I guess it will remain unfixed.\n>\n\n_________________________________________________________________\nTurn searches into helpful donations. Make your search count. \nhttp://click4thecause.live.com/search/charity/default.aspx?source=hmemtagline_donation&FORM=WLMTAG\n"},{"id":"33152","messageId":"45C0C3BC.BD01337E@eudaptics.com","threadId":"6595","inReplyTo":"BAY13-F213DF79906B3889D42369D0A50@phx.gbl","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Johannes Sixt","fromEmail":"j.sixt@eudaptics.com","sentAt":"2007-01-31T16:28:44Z","receivedAt":"2007-01-31T16:28:44Z","isPatch":true,"sender":{"key":"j6t@kdbg.org","avatar":"https://avatars.githubusercontent.com/u/14810926?v=4"},"body":"Mike Nefari wrote:\n> \n> The gitk gui layout was completely broken on Cygwin. If gitk was started\n> without previous geometry in ~/.gitk, the user could drag the window sashes\n> to get a useable layout. However, if ~/.gitk existed, this was not possible\n> at all.\n> \n> The fix was to rewrite makewindow, changing the toplevel containers and\n> the particular geometry information saved between sessions. Numerous bugs\n> in both the Cygwin and the Linux Tk versions make this a delicate\n> balancing act: the version here works in both but many subtle variants\n> are competely broken in one or the other environment.\n\nYour mailer has garbled your patch. But once this is fixed, it works\nquite well, both on my Linux box with Tk 8.4, where gitk's layout was\nsuboptimal, as well as under MinGW, also with Tk 8.4.\n\nThank you, you saved my day!\n\n-- Hannes\n"},{"id":"33153","messageId":"45C0C4DF.C0EB4495@eudaptics.com","threadId":"6595","inReplyTo":"Pine.LNX.4.63.0701311612420.22628@wbgn013.biozentrum.uni-wuerzburg.de","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Johannes Sixt","fromEmail":"j.sixt@eudaptics.com","sentAt":"2007-01-31T16:33:35Z","receivedAt":"2007-01-31T16:33:35Z","isPatch":true,"sender":{"key":"j6t@kdbg.org","avatar":"https://avatars.githubusercontent.com/u/14810926?v=4"},"body":"Johannes Schindelin wrote:\n> I also verified that with my Tcl/Tk installation on MacOSX, a patch like\n> this was needed. IIRC Paulus argued that I should get a native TclTk,\n> which is supposed to work (though not with the paths on Cygwin, oh well).\n> \n> Oh, and it is also needed for MinGW. But I guess it will remain unfixed.\n\nYou patch does not improve gitk under MinGW. The layout becomes less\nuseful because the lower part becomes too high, so that the Search bar\nand some part of the patch + file list windows is not visible. :(\n\n-- Hannes\n"},{"id":"33154","messageId":"81b0412b0701310836q4222c82arcfda05d3594182af@mail.gmail.com","threadId":"6595","inReplyTo":"BAY13-F213DF79906B3889D42369D0A50@phx.gbl","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Alex Riesen","fromEmail":"raa.lkml@gmail.com","sentAt":"2007-01-31T16:36:16Z","receivedAt":"2007-01-31T16:36:16Z","isPatch":true,"sender":{"key":"raa.lkml@gmail.com","avatar":"https://avatars.githubusercontent.com/u/324101?v=4"},"body":"On 1/31/07, Mike Nefari <fastestspinner@hotmail.com> wrote:\n> The gitk gui layout was completely broken on Cygwin. If gitk was started\n> without previous geometry in ~/.gitk, the user could drag the window sashes\n> to get a useable layout. However, if ~/.gitk existed, this was not possible\n> at all.\n>\n> The fix was to rewrite makewindow, changing the toplevel containers and\n> the particular geometry information saved between sessions. Numerous bugs\n> in both the Cygwin and the Linux Tk versions make this a delicate\n> balancing act: the version here works in both but many subtle variants\n> are competely broken in one or the other environment.\n>\n\nThe patch is broken very spectacularly. How have you made it?\nCopy-paste in the browsers window?\n"},{"id":"33155","messageId":"BAY13-F4E31B150239BDBBE1AC18D0A50@phx.gbl","threadId":"6595","inReplyTo":"81b0412b0701310836q4222c82arcfda05d3594182af@mail.gmail.com","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Mark Levedahl","fromEmail":"fastestspinner@hotmail.com","sentAt":"2007-01-31T16:39:45Z","receivedAt":"2007-01-31T16:39:45Z","isPatch":true,"sender":{"key":"fastestspinner@hotmail.com","avatar":null},"body":"I will resend tonight when I get access to an account where I can control \nthe mailer.\n\n\n>From: \"Alex Riesen\" <raa.lkml@gmail.com>\n>To: \"Mike Nefari\" <fastestspinner@hotmail.com>\n>CC: git@vger.kernel.org\n>Subject: Re: [PATCH] Make gitk work reasonably well on Cygwin.\n>Date: Wed, 31 Jan 2007 17:36:16 +0100\n>\n>On 1/31/07, Mike Nefari <fastestspinner@hotmail.com> wrote:\n>>The gitk gui layout was completely broken on Cygwin. If gitk was started\n>>without previous geometry in ~/.gitk, the user could drag the window \n>>sashes\n>>to get a useable layout. However, if ~/.gitk existed, this was not \n>>possible\n>>at all.\n>>\n>>The fix was to rewrite makewindow, changing the toplevel containers and\n>>the particular geometry information saved between sessions. Numerous bugs\n>>in both the Cygwin and the Linux Tk versions make this a delicate\n>>balancing act: the version here works in both but many subtle variants\n>>are competely broken in one or the other environment.\n>>\n>\n>The patch is broken very spectacularly. How have you made it?\n>Copy-paste in the browsers window?\n\n_________________________________________________________________\nGet live scores and news about your team: Add the Live.com Football Page  \nhttp://www.live.com/?addtemplate=football\n"},{"id":"33157","messageId":"Pine.LNX.4.63.0701311742370.22628@wbgn013.biozentrum.uni-wuerzburg.de","threadId":"6595","inReplyTo":"45C0C4DF.C0EB4495@eudaptics.com","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2007-01-31T16:44:18Z","receivedAt":"2007-01-31T16:44:18Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"\nHi,\nOn Wed, 31 Jan 2007, Johannes Sixt wrote:\n\n> Johannes Schindelin wrote:\n> > I also verified that with my Tcl/Tk installation on MacOSX, a patch like\n> > this was needed. IIRC Paulus argued that I should get a native TclTk,\n> > which is supposed to work (though not with the paths on Cygwin, oh well).\n> > \n> > Oh, and it is also needed for MinGW. But I guess it will remain unfixed.\n> \n> You patch does not improve gitk under MinGW. The layout becomes less\n> useful because the lower part becomes too high, so that the Search bar\n> and some part of the patch + file list windows is not visible. :(\n\nAh yes, I don't use gitk all that often, and I did not realize that there \nwas a search bar. Still, I think Mike's patch is too verbose, i.e. it is \nnot minimal enough ;-)\n\nCiao,\nDscho\n"},{"id":"33200","messageId":"45C14563.8060707@verizon.net","threadId":"6595","inReplyTo":"Pine.LNX.4.63.0701311612420.22628@wbgn013.biozentrum.uni-wuerzburg.de","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Mark Levedahl","fromEmail":"mdl123@verizon.net","sentAt":"2007-02-01T01:41:55Z","receivedAt":"2007-02-01T01:41:55Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"The gitk gui layout was completely broken on Cygwin. If gitk was started\nwithout previous geometry in ~/.gitk, the user could drag the window \nsashes to get a useable layout. However, if ~/.gitk existed, this was \nnot possible at all.\n\nThe fix was to rewrite makewindow, changing the toplevel containers and\nthe particular geometry information saved between sessions. Numerous \nbugs in both the Cygwin and the Linux Tk versions make this a delicate\nbalancing act: the version here works in both but many subtle variants\nare competely broken in one or the other environment.\n\nThree user visible changes result:\n1 - The viewer is fully functional under Cygwin.\n2 - The search bar moves from the bottom to the top of the lower left\n    pane. This was necessary to get around a layout problem on Cygwin.\n3 - The window size and position is saved and restored between sessions.\n    Again, this is necessary to get around a layout problem on Cygwin.\n\nAlso, responding to other comments on this thread:\n\n1) Regarding the size of the patch. I tried many different approaches to \ngetting the layout to work on Cgywin as well as Linux, ultimately the \nonly approach that worked required changing the very top level structure \ncontaining the Tk widgets. As the  style used names all widgets using \ntheir parents, every widget's name is changed. This makes the patch seem \nmore complex than it is, many changes  are just changing names. There \nmight be a simpler solution, I didn't find it and I can find absolutely \nno indication from googling that anyone else has found a better solution.\n\n2) I have changed the default window size (used only the first time gitk \nis run) to be smaller. This may address the problem of layout noted in \nmingw. Note that the search bar is not at the bottom left, but is now \nmiddle left. On cygwin, the widgets mostly resize with the window, but \nmay not always do so if the resizing is significant, and in particular \nthe lower left pane can extend below the window and be clipped. \nRestarting gitk after setting the desired geometry will cause all \nwidgets to size correctly, so this layout problem is a minor annoyance \nsuffered only the first time, and only on Cygwin (it does not happen on \nLinux).\n\n3) I have tried this extensively on Linux and Cygwin (the latter using \nthe native Tcl /Tk as well as one built for the X-server under cygwin). \nThis version of gitk works well in all, and as far as I can tell has no \nregressions from the current version while significantly improving the \nsituation in native Cygwin.\n\nMark Levedahl\n\n\n>From ba01b56d615dcc553e278ead7030a0f0b4918766 Mon Sep 17 00:00:00 2001\nFrom: Mark Levedahl <mdl123@verizon.net>\nDate: Wed, 31 Jan 2007 18:51:21 -0500\nSubject: [PATCH] Make gitk work reasonably well on Cygwin.\n\nThe gitk gui layout was completely broken on Cygwin. If gitk was started\nwithout previous geometry in ~/.gitk, the user could drag the window sashes\nto get a useable layout. However, if ~/.gitk existed, this was not possible\nat all.\n\nThe fix was to rewrite makewindow, changing the toplevel containers and\nthe particular geometry information saved between sessions. Numerous bugs\nin both the Cygwin and the Linux Tk versions make this a delicate\nbalancing act: the version here works in both but many subtle variants\nare competely broken in one or the other environment.\n\nThree user visible changes result:\n1 - The viewer is fully functional under Cygwin.\n2 - The search bar moves from the bottom to the top of the lower left\n    pane. This was necessary to get around a layout problem on Cygwin.\n3 - The window size and position is saved and restored between sessions.\n    Again, this is necessary to get around a layout problem on Cygwin.\n---\n gitk |  284 ++++++++++++++++++++++++++++++++++++------------------------------\n 1 files changed, 155 insertions(+), 129 deletions(-)\n\ndiff --git a/gitk b/gitk\nindex 31d0aad..a0d27f5 100755\n--- a/gitk\n+++ b/gitk\n@@ -427,7 +427,7 @@ proc makewindow {} {\n     .bar.view add separator\n     .bar.view add radiobutton -label \"All files\" -command {showview 0} \\\n \t-variable selectedview -value 0\n-    \n+\n     menu .bar.help\n     .bar add cascade -label \"Help\" -menu .bar.help\n     .bar.help add command -label \"About gitk\" -command about\n@@ -435,56 +435,59 @@ proc makewindow {} {\n     .bar.help configure -font $uifont\n     . configure -menu .bar\n \n-    if {![info exists geometry(canv1)]} {\n-\tset geometry(canv1) [expr {45 * $charspc}]\n-\tset geometry(canv2) [expr {30 * $charspc}]\n-\tset geometry(canv3) [expr {15 * $charspc}]\n-\tset geometry(canvh) [expr {25 * $linespc + 4}]\n-\tset geometry(ctextw) 80\n-\tset geometry(ctexth) 30\n-\tset geometry(cflistw) 30\n-    }\n+    # the gui has upper and lower half, parts of a paned window.\n     panedwindow .ctop -orient vertical\n-    if {[info exists geometry(width)]} {\n-\t.ctop conf -width $geometry(width) -height $geometry(height)\n-\tset texth [expr {$geometry(height) - $geometry(canvh) - 56}]\n-\tset geometry(ctexth) [expr {($texth - 8) /\n-\t\t\t\t    [font metrics $textfont -linespace]}]\n-    }\n-    frame .ctop.top\n-    frame .ctop.top.bar\n-    frame .ctop.top.lbar\n-    pack .ctop.top.lbar -side bottom -fill x\n-    pack .ctop.top.bar -side bottom -fill x\n-    set cscroll .ctop.top.csb\n-    scrollbar $cscroll -command {allcanvs yview} -highlightthickness 0\n-    pack $cscroll -side right -fill y\n-    panedwindow .ctop.top.clist -orient horizontal -sashpad 0 -handlesize 4\n-    pack .ctop.top.clist -side top -fill both -expand 1\n-    .ctop add .ctop.top\n-    set canv .ctop.top.clist.canv\n-    canvas $canv -height $geometry(canvh) -width $geometry(canv1) \\\n+\n+    # possibly use assumed geometry\n+    if {![info exists geometry(topheight)]} {\n+        set geometry(topheight) [expr {15 * $linespc}]\n+        set geometry(topwidth) [expr {80 * $charspc}]\n+        set geometry(botheight) [expr {15 * $linespc}]\n+        set geometry(botwidth) [expr {50 * $charspc}]\n+        set geometry(canv) [expr {40 * $charspc}]\n+        set geometry(canv2) [expr {20 * $charspc}]\n+        set geometry(canv3) [expr {20 * $charspc}]\n+    }\n+\n+    # the upper half will have a paned window, a scroll bar to the right, and some stuff below\n+    frame .tf -height $geometry(topheight) -width $geometry(topwidth)\n+    frame .tf.histframe\n+    panedwindow .tf.histframe.pwclist -orient horizontal -sashpad 0 -handlesize 4\n+\n+    # create three canvases\n+    set cscroll .tf.histframe.csb\n+    set canv .tf.histframe.pwclist.canv\n+    canvas $canv -width $geometry(canv) \\\n \t-background $bgcolor -bd 0 \\\n \t-yscrollincr $linespc -yscrollcommand \"scrollcanv $cscroll\"\n-    .ctop.top.clist add $canv\n-    set canv2 .ctop.top.clist.canv2\n-    canvas $canv2 -height $geometry(canvh) -width $geometry(canv2) \\\n+    .tf.histframe.pwclist add $canv\n+    set canv2 .tf.histframe.pwclist.canv2\n+    canvas $canv2 -width $geometry(canv2) \\\n \t-background $bgcolor -bd 0 -yscrollincr $linespc\n-    .ctop.top.clist add $canv2\n-    set canv3 .ctop.top.clist.canv3\n-    canvas $canv3 -height $geometry(canvh) -width $geometry(canv3) \\\n+    .tf.histframe.pwclist add $canv2\n+    set canv3 .tf.histframe.pwclist.canv3\n+    canvas $canv3 -width $geometry(canv3) \\\n \t-background $bgcolor -bd 0 -yscrollincr $linespc\n-    .ctop.top.clist add $canv3\n-    bind .ctop.top.clist <Configure> {resizeclistpanes %W %w}\n+    .tf.histframe.pwclist add $canv3\n+\n+    # a scroll bar to rule them\n+    scrollbar $cscroll -command {allcanvs yview} -highlightthickness 0\n+    pack $cscroll -side right -fill y\n+    bind .tf.histframe.pwclist <Configure> {resizeclistpanes %W %w}\n     lappend bglist $canv $canv2 $canv3\n+    pack .tf.histframe.pwclist -fill both -expand 1 -side left\n+\n+    # we have two button bars at bottom of top frame. Bar 1\n+    frame .tf.bar\n+    frame .tf.lbar -height 15\n \n-    set sha1entry .ctop.top.bar.sha1\n+    set sha1entry .tf.bar.sha1\n     set entries $sha1entry\n-    set sha1but .ctop.top.bar.sha1label\n+    set sha1but .tf.bar.sha1label\n     button $sha1but -text \"SHA1 ID: \" -state disabled -relief flat \\\n \t-command gotocommit -width 8 -font $uifont\n     $sha1but conf -disabledforeground [$sha1but cget -foreground]\n-    pack .ctop.top.bar.sha1label -side left\n+    pack .tf.bar.sha1label -side left\n     entry $sha1entry -width 40 -font $textfont -textvariable sha1string\n     trace add variable sha1string write sha1change\n     pack $sha1entry -side left -pady 2\n@@ -505,91 +508,107 @@ proc makewindow {} {\n \t0x00, 0x38, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x00, 0x38, 0x00, 0x1c,\n \t0x00, 0x0e, 0x00, 0x07, 0x80, 0x03, 0xc0, 0x01};\n     }\n-    button .ctop.top.bar.leftbut -image bm-left -command goback \\\n+    button .tf.bar.leftbut -image bm-left -command goback \\\n \t-state disabled -width 26\n-    pack .ctop.top.bar.leftbut -side left -fill y\n-    button .ctop.top.bar.rightbut -image bm-right -command goforw \\\n+    pack .tf.bar.leftbut -side left -fill y\n+    button .tf.bar.rightbut -image bm-right -command goforw \\\n \t-state disabled -width 26\n-    pack .ctop.top.bar.rightbut -side left -fill y\n+    pack .tf.bar.rightbut -side left -fill y\n \n-    button .ctop.top.bar.findbut -text \"Find\" -command dofind -font $uifont\n-    pack .ctop.top.bar.findbut -side left\n+    button .tf.bar.findbut -text \"Find\" -command dofind -font $uifont\n+    pack .tf.bar.findbut -side left\n     set findstring {}\n-    set fstring .ctop.top.bar.findstring\n+    set fstring .tf.bar.findstring\n     lappend entries $fstring\n     entry $fstring -width 30 -font $textfont -textvariable findstring\n     trace add variable findstring write find_change\n-    pack $fstring -side left -expand 1 -fill x\n+    pack $fstring -side left -expand 1 -fill x -in .tf.bar\n     set findtype Exact\n-    set findtypemenu [tk_optionMenu .ctop.top.bar.findtype \\\n-\t\t\t  findtype Exact IgnCase Regexp]\n+    set findtypemenu [tk_optionMenu .tf.bar.findtype \\\n+\t\t      findtype Exact IgnCase Regexp]\n     trace add variable findtype write find_change\n-    .ctop.top.bar.findtype configure -font $uifont\n-    .ctop.top.bar.findtype.menu configure -font $uifont\n+    .tf.bar.findtype configure -font $uifont\n+    .tf.bar.findtype.menu configure -font $uifont\n     set findloc \"All fields\"\n-    tk_optionMenu .ctop.top.bar.findloc findloc \"All fields\" Headline \\\n+    tk_optionMenu .tf.bar.findloc findloc \"All fields\" Headline \\\n \tComments Author Committer\n     trace add variable findloc write find_change\n-    .ctop.top.bar.findloc configure -font $uifont\n-    .ctop.top.bar.findloc.menu configure -font $uifont\n-    pack .ctop.top.bar.findloc -side right\n-    pack .ctop.top.bar.findtype -side right\n+    .tf.bar.findloc configure -font $uifont\n+    .tf.bar.findloc.menu configure -font $uifont\n+    pack .tf.bar.findloc -side right\n+    pack .tf.bar.findtype -side right\n \n-    label .ctop.top.lbar.flabel -text \"Highlight:  Commits \" \\\n-\t-font $uifont\n-    pack .ctop.top.lbar.flabel -side left -fill y\n+    #-----------------\n+\n+    # build up the bottom bar of upper window\n+    label .tf.lbar.flabel -text \"Highlight:  Commits \" \\\n+    -font $uifont\n+    pack .tf.lbar.flabel -side left -fill y\n     set gdttype \"touching paths:\"\n-    set gm [tk_optionMenu .ctop.top.lbar.gdttype gdttype \"touching paths:\" \\\n-\t\t\"adding/removing string:\"]\n+    set gm [tk_optionMenu .tf.lbar.gdttype gdttype \"touching paths:\" \\\n+\t\"adding/removing string:\"]\n     trace add variable gdttype write hfiles_change\n     $gm conf -font $uifont\n-    .ctop.top.lbar.gdttype conf -font $uifont\n-    pack .ctop.top.lbar.gdttype -side left -fill y\n-    entry .ctop.top.lbar.fent -width 25 -font $textfont \\\n+    .tf.lbar.gdttype conf -font $uifont\n+    pack .tf.lbar.gdttype -side left -fill y\n+    entry .tf.lbar.fent -width 25 -font $textfont \\\n \t-textvariable highlight_files\n     trace add variable highlight_files write hfiles_change\n-    lappend entries .ctop.top.lbar.fent\n-    pack .ctop.top.lbar.fent -side left -fill x -expand 1\n-    label .ctop.top.lbar.vlabel -text \" OR in view\" -font $uifont\n-    pack .ctop.top.lbar.vlabel -side left -fill y\n+    lappend entries .tf.lbar.fent\n+    pack .tf.lbar.fent -side left -fill x -expand 1\n+    label .tf.lbar.vlabel -text \" OR in view\" -font $uifont\n+    pack .tf.lbar.vlabel -side left -fill y\n     global viewhlmenu selectedhlview\n-    set viewhlmenu [tk_optionMenu .ctop.top.lbar.vhl selectedhlview None]\n+    set viewhlmenu [tk_optionMenu .tf.lbar.vhl selectedhlview None]\n     $viewhlmenu entryconf None -command delvhighlight\n     $viewhlmenu conf -font $uifont\n-    .ctop.top.lbar.vhl conf -font $uifont\n-    pack .ctop.top.lbar.vhl -side left -fill y\n-    label .ctop.top.lbar.rlabel -text \" OR \" -font $uifont\n-    pack .ctop.top.lbar.rlabel -side left -fill y\n+    .tf.lbar.vhl conf -font $uifont\n+    pack .tf.lbar.vhl -side left -fill y\n+    label .tf.lbar.rlabel -text \" OR \" -font $uifont\n+    pack .tf.lbar.rlabel -side left -fill y\n     global highlight_related\n-    set m [tk_optionMenu .ctop.top.lbar.relm highlight_related None \\\n-\t       \"Descendent\" \"Not descendent\" \"Ancestor\" \"Not ancestor\"]\n+    set m [tk_optionMenu .tf.lbar.relm highlight_related None \\\n+\t\"Descendent\" \"Not descendent\" \"Ancestor\" \"Not ancestor\"]\n     $m conf -font $uifont\n-    .ctop.top.lbar.relm conf -font $uifont\n+    .tf.lbar.relm conf -font $uifont\n     trace add variable highlight_related write vrel_change\n-    pack .ctop.top.lbar.relm -side left -fill y\n-\n-    panedwindow .ctop.cdet -orient horizontal\n-    .ctop add .ctop.cdet\n-    frame .ctop.cdet.left\n-    frame .ctop.cdet.left.bot\n-    pack .ctop.cdet.left.bot -side bottom -fill x\n-    button .ctop.cdet.left.bot.search -text \"Search\" -command dosearch \\\n+    pack .tf.lbar.relm -side left -fill y\n+\n+    # Finish putting the upper half of the viewer together\n+    pack .tf.lbar -in .tf -side bottom -fill x\n+    pack .tf.bar -in .tf -side bottom -fill x\n+    pack .tf.histframe -fill both -side top -expand 1\n+    .ctop add .tf\n+\n+    # now build up the bottom\n+    panedwindow .pwbottom -orient horizontal\n+\n+    # lower left, a text box over search bar, scroll bar to the right\n+    # if we know window height, then that will set the lower text height, otherwise\n+    # we set lower text height which will drive window height\n+    if {[info exists geometry(main)]} {\n+        frame .bleft -width $geometry(botwidth)\n+    } else {\n+        frame .bleft -width $geometry(botwidth) -height $geometry(botheight)\n+    }\n+    frame .bleft.top\n+\n+    button .bleft.top.search -text \"Search\" -command dosearch \\\n \t-font $uifont\n-    pack .ctop.cdet.left.bot.search -side left -padx 5\n-    set sstring .ctop.cdet.left.bot.sstring\n+    pack .bleft.top.search -side left -padx 5\n+    set sstring .bleft.top.sstring\n     entry $sstring -width 20 -font $textfont -textvariable searchstring\n     lappend entries $sstring\n     trace add variable searchstring write incrsearch\n     pack $sstring -side left -expand 1 -fill x\n-    set ctext .ctop.cdet.left.ctext\n+    set ctext .bleft.ctext\n     text $ctext -background $bgcolor -foreground $fgcolor \\\n \t-state disabled -font $textfont \\\n-\t-width $geometry(ctextw) -height $geometry(ctexth) \\\n \t-yscrollcommand scrolltext -wrap none\n-    scrollbar .ctop.cdet.left.sb -command \"$ctext yview\"\n-    pack .ctop.cdet.left.sb -side right -fill y\n+    scrollbar .bleft.sb -command \"$ctext yview\"\n+    pack .bleft.top -side top -fill x\n+    pack .bleft.sb -side right -fill y\n     pack $ctext -side left -fill both -expand 1\n-    .ctop.cdet add .ctop.cdet.left\n     lappend bglist $ctext\n     lappend fglist $ctext\n \n@@ -620,36 +639,45 @@ proc makewindow {} {\n     $ctext tag conf msep -font [concat $textfont bold]\n     $ctext tag conf found -back yellow\n \n-    frame .ctop.cdet.right\n-    frame .ctop.cdet.right.mode\n-    radiobutton .ctop.cdet.right.mode.patch -text \"Patch\" \\\n+    .pwbottom add .bleft\n+\n+    # lower right\n+    frame .bright\n+    frame .bright.mode\n+    radiobutton .bright.mode.patch -text \"Patch\" \\\n \t-command reselectline -variable cmitmode -value \"patch\"\n-    radiobutton .ctop.cdet.right.mode.tree -text \"Tree\" \\\n+    radiobutton .bright.mode.tree -text \"Tree\" \\\n \t-command reselectline -variable cmitmode -value \"tree\"\n-    grid .ctop.cdet.right.mode.patch .ctop.cdet.right.mode.tree -sticky ew\n-    pack .ctop.cdet.right.mode -side top -fill x\n-    set cflist .ctop.cdet.right.cfiles\n+    grid .bright.mode.patch .bright.mode.tree -sticky ew\n+    pack .bright.mode -side top -fill x\n+    set cflist .bright.cfiles\n     set indent [font measure $mainfont \"nn\"]\n-    text $cflist -width $geometry(cflistw) \\\n+    text $cflist \\\n \t-background $bgcolor -foreground $fgcolor \\\n \t-font $mainfont \\\n \t-tabs [list $indent [expr {2 * $indent}]] \\\n-\t-yscrollcommand \".ctop.cdet.right.sb set\" \\\n+\t-yscrollcommand \".bright.sb set\" \\\n \t-cursor [. cget -cursor] \\\n \t-spacing1 1 -spacing3 1\n     lappend bglist $cflist\n     lappend fglist $cflist\n-    scrollbar .ctop.cdet.right.sb -command \"$cflist yview\"\n-    pack .ctop.cdet.right.sb -side right -fill y\n+    scrollbar .bright.sb -command \"$cflist yview\"\n+    pack .bright.sb -side right -fill y\n     pack $cflist -side left -fill both -expand 1\n     $cflist tag configure highlight \\\n \t-background [$cflist cget -selectbackground]\n     $cflist tag configure bold -font [concat $mainfont bold]\n-    .ctop.cdet add .ctop.cdet.right\n-    bind .ctop.cdet <Configure> {resizecdetpanes %W %w}\n \n-    pack .ctop -side top -fill both -expand 1\n+    .pwbottom add .bright\n+    .ctop add .pwbottom\n+\n+    # restore window position if known\n+    if {[info exists geometry(main)]} {\n+        wm geometry . \"$geometry(main)\"\n+    }\n \n+    bind .pwbottom <Configure> {resizecdetpanes %W %w}\n+    pack .ctop -fill both -expand 1\n     bindall <1> {selcanvline %W %x %y}\n     #bindall <B1-Motion> {selcanvline %W %x %y}\n     bindall <ButtonRelease-4> \"allcanvs yview scroll -5 units\"\n@@ -802,18 +830,16 @@ proc savestuff {w} {\n \tputs $f [list set fgcolor $fgcolor]\n \tputs $f [list set colors $colors]\n \tputs $f [list set diffcolors $diffcolors]\n-\tputs $f \"set geometry(width) [winfo width .ctop]\"\n-\tputs $f \"set geometry(height) [winfo height .ctop]\"\n-\tputs $f \"set geometry(canv1) [expr {[winfo width $canv]-2}]\"\n-\tputs $f \"set geometry(canv2) [expr {[winfo width $canv2]-2}]\"\n-\tputs $f \"set geometry(canv3) [expr {[winfo width $canv3]-2}]\"\n-\tputs $f \"set geometry(canvh) [expr {[winfo height $canv]-2}]\"\n-\tset wid [expr {([winfo width $ctext] - 8) \\\n-\t\t\t   / [font measure $textfont \"0\"]}]\n-\tputs $f \"set geometry(ctextw) $wid\"\n-\tset wid [expr {([winfo width $cflist] - 11) \\\n-\t\t\t   / [font measure [$cflist cget -font] \"0\"]}]\n-\tputs $f \"set geometry(cflistw) $wid\"\n+\n+        puts $f \"set geometry(main) [winfo geometry .]\"\n+\tputs $f \"set geometry(topwidth) [winfo width .tf]\"\n+\tputs $f \"set geometry(topheight) [winfo height .tf]\"\n+\tputs $f \"set geometry(canv) [expr {[winfo width $canv]-0}]\"\n+\tputs $f \"set geometry(canv2) [expr {[winfo width $canv2]-0}]\"\n+\tputs $f \"set geometry(canv3) [expr {[winfo width $canv3]-0}]\"\n+\tputs $f \"set geometry(botwidth) [winfo width .bleft]\"\n+\tputs $f \"set geometry(botheight) [winfo height .bleft]\"\n+\n \tputs -nonewline $f \"set permviews {\"\n \tfor {set v 0} {$v < $nextviewnum} {incr v} {\n \t    if {$viewperm($v)} {\n@@ -1402,7 +1428,7 @@ proc newview {ishighlight} {\n     set newviewname($nextviewnum) \"View $nextviewnum\"\n     set newviewperm($nextviewnum) 0\n     set newviewargs($nextviewnum) [shellarglist $revtreeargs]\n-    vieweditor $top $nextviewnum \"Gitk view definition\" \n+    vieweditor $top $nextviewnum \"Gitk view definition\"\n }\n \n proc editview {} {\n@@ -3897,7 +3923,7 @@ proc selectline {l isnew} {\n \t}\n \t$ctext insert end \"\\n\"\n     }\n- \n+\n     set headers {}\n     set olds [lindex $parentlist $l]\n     if {[llength $olds] > 1} {\n@@ -4006,7 +4032,7 @@ proc selnextpage {dir} {\n         set l [expr $numcommits - 1]\n     }\n     unmarkmatches\n-    selectline $l 1    \n+    selectline $l 1\n }\n \n proc unselectline {} {\n@@ -4043,11 +4069,11 @@ proc addtohistory {cmd} {\n     }\n     incr historyindex\n     if {$historyindex > 1} {\n-\t.ctop.top.bar.leftbut conf -state normal\n+\t.tf.bar.leftbut conf -state normal\n     } else {\n-\t.ctop.top.bar.leftbut conf -state disabled\n+\t.tf.bar.leftbut conf -state disabled\n     }\n-    .ctop.top.bar.rightbut conf -state disabled\n+    .tf.bar.rightbut conf -state disabled\n }\n \n proc godo {elt} {\n@@ -4067,10 +4093,10 @@ proc goback {} {\n     if {$historyindex > 1} {\n \tincr historyindex -1\n \tgodo [lindex $history [expr {$historyindex - 1}]]\n-\t.ctop.top.bar.rightbut conf -state normal\n+\t.tf.bar.rightbut conf -state normal\n     }\n     if {$historyindex <= 1} {\n-\t.ctop.top.bar.leftbut conf -state disabled\n+\t.tf.bar.leftbut conf -state disabled\n     }\n }\n \n@@ -4081,10 +4107,10 @@ proc goforw {} {\n \tset cmd [lindex $history $historyindex]\n \tincr historyindex\n \tgodo $cmd\n-\t.ctop.top.bar.leftbut conf -state normal\n+\t.tf.bar.leftbut conf -state normal\n     }\n     if {$historyindex >= [llength $history]} {\n-\t.ctop.top.bar.rightbut conf -state disabled\n+\t.tf.bar.rightbut conf -state disabled\n     }\n }\n \n@@ -4591,7 +4617,7 @@ proc searchmarkvisible {doall} {\n proc scrolltext {f0 f1} {\n     global searchstring\n \n-    .ctop.cdet.left.sb set $f0 $f1\n+    .bleft.sb set $f0 $f1\n     if {$searchstring ne {}} {\n \tsearchmarkvisible 0\n     }\n-- \n1.5.0.rc2.62.g874ea\n\n"},{"id":"33202","messageId":"45C14BF6.50802@verizon.net","threadId":"6595","inReplyTo":"Pine.LNX.4.63.0701311612420.22628@wbgn013.biozentrum.uni-wuerzburg.de","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Mark Levedahl","fromEmail":"mdl123@verizon.net","sentAt":"2007-02-01T02:09:58Z","receivedAt":"2007-02-01T02:09:58Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"The gitk gui layout was completely broken on Cygwin. If gitk was started\nwithout previous geometry in ~/.gitk, the user could drag the window \nsashes to get a useable layout. However, if ~/.gitk existed, this was \nnot possible at all.\n\nThe fix was to rewrite makewindow, changing the toplevel containers and\nthe particular geometry information saved between sessions. Numerous \nbugs in both the Cygwin and the Linux Tk versions make this a delicate\nbalancing act: the version here works in both but many subtle variants\nare competely broken in one or the other environment.\n\nThree user visible changes result:\n1 - The viewer is fully functional under Cygwin.\n2 - The search bar moves from the bottom to the top of the lower left\n    pane. This was necessary to get around a layout problem on Cygwin.\n3 - The window size and position is saved and restored between sessions.\n    Again, this is necessary to get around a layout problem on Cygwin.\n\nAlso, responding to other comments on this thread:\n\n1) Regarding the size of the patch. I tried many different approaches to \ngetting the layout to work on Cgywin as well as Linux, ultimately the \nonly approach that worked required changing the very top level structure \ncontaining the Tk widgets. As the  style used names all widgets using \ntheir parents, every widget's name is changed. This makes the patch seem \nmore complex than it is, many changes  are just changing names. There \nmight be a simpler solution, I didn't find it and I can find absolutely \nno indication from googling that anyone else has found a better solution.\n\n2) I have changed the default window size (used only the first time gitk \nis run) to be smaller. This may address the problem of layout noted in \nmingw. Note that the search bar is not at the bottom left, but is now \nmiddle left. On cygwin, the widgets mostly resize with the window, but \nmay not always do so if the resizing is significant, and in particular \nthe lower left pane can extend below the window and be clipped. \nRestarting gitk after setting the desired geometry will cause all \nwidgets to size correctly, so this layout problem is a minor annoyance \nsuffered only the first time, and only on Cygwin (it does not happen on \nLinux).\n\n3) I have tried this extensively on Linux and Cygwin (the latter using \nthe native Tcl /Tk as well as one built for the X-server under cygwin). \nThis version of gitk works well in all, and as far as I can tell has no \nregressions from the current version while significantly improving the \nsituation in native Cygwin.\n\nMark Levedahl\n\n\n>From ba01b56d615dcc553e278ead7030a0f0b4918766 Mon Sep 17 00:00:00 2001\nFrom: Mark Levedahl <mdl123@verizon.net>\nDate: Wed, 31 Jan 2007 18:51:21 -0500\nSubject: [PATCH] Make gitk work reasonably well on Cygwin.\n\nThe gitk gui layout was completely broken on Cygwin. If gitk was started\nwithout previous geometry in ~/.gitk, the user could drag the window sashes\nto get a useable layout. However, if ~/.gitk existed, this was not possible\nat all.\n\nThe fix was to rewrite makewindow, changing the toplevel containers and\nthe particular geometry information saved between sessions. Numerous bugs\nin both the Cygwin and the Linux Tk versions make this a delicate\nbalancing act: the version here works in both but many subtle variants\nare competely broken in one or the other environment.\n\nThree user visible changes result:\n1 - The viewer is fully functional under Cygwin.\n2 - The search bar moves from the bottom to the top of the lower left\n    pane. This was necessary to get around a layout problem on Cygwin.\n3 - The window size and position is saved and restored between sessions.\n    Again, this is necessary to get around a layout problem on Cygwin.\n---\n gitk |  284 ++++++++++++++++++++++++++++++++++++------------------------------\n 1 files changed, 155 insertions(+), 129 deletions(-)\n\ndiff --git a/gitk b/gitk\nindex 31d0aad..a0d27f5 100755\n--- a/gitk\n+++ b/gitk\n@@ -427,7 +427,7 @@ proc makewindow {} {\n     .bar.view add separator\n     .bar.view add radiobutton -label \"All files\" -command {showview 0} \\\n \t-variable selectedview -value 0\n-    \n+\n     menu .bar.help\n     .bar add cascade -label \"Help\" -menu .bar.help\n     .bar.help add command -label \"About gitk\" -command about\n@@ -435,56 +435,59 @@ proc makewindow {} {\n     .bar.help configure -font $uifont\n     . configure -menu .bar\n \n-    if {![info exists geometry(canv1)]} {\n-\tset geometry(canv1) [expr {45 * $charspc}]\n-\tset geometry(canv2) [expr {30 * $charspc}]\n-\tset geometry(canv3) [expr {15 * $charspc}]\n-\tset geometry(canvh) [expr {25 * $linespc + 4}]\n-\tset geometry(ctextw) 80\n-\tset geometry(ctexth) 30\n-\tset geometry(cflistw) 30\n-    }\n+    # the gui has upper and lower half, parts of a paned window.\n     panedwindow .ctop -orient vertical\n-    if {[info exists geometry(width)]} {\n-\t.ctop conf -width $geometry(width) -height $geometry(height)\n-\tset texth [expr {$geometry(height) - $geometry(canvh) - 56}]\n-\tset geometry(ctexth) [expr {($texth - 8) /\n-\t\t\t\t    [font metrics $textfont -linespace]}]\n-    }\n-    frame .ctop.top\n-    frame .ctop.top.bar\n-    frame .ctop.top.lbar\n-    pack .ctop.top.lbar -side bottom -fill x\n-    pack .ctop.top.bar -side bottom -fill x\n-    set cscroll .ctop.top.csb\n-    scrollbar $cscroll -command {allcanvs yview} -highlightthickness 0\n-    pack $cscroll -side right -fill y\n-    panedwindow .ctop.top.clist -orient horizontal -sashpad 0 -handlesize 4\n-    pack .ctop.top.clist -side top -fill both -expand 1\n-    .ctop add .ctop.top\n-    set canv .ctop.top.clist.canv\n-    canvas $canv -height $geometry(canvh) -width $geometry(canv1) \\\n+\n+    # possibly use assumed geometry\n+    if {![info exists geometry(topheight)]} {\n+        set geometry(topheight) [expr {15 * $linespc}]\n+        set geometry(topwidth) [expr {80 * $charspc}]\n+        set geometry(botheight) [expr {15 * $linespc}]\n+        set geometry(botwidth) [expr {50 * $charspc}]\n+        set geometry(canv) [expr {40 * $charspc}]\n+        set geometry(canv2) [expr {20 * $charspc}]\n+        set geometry(canv3) [expr {20 * $charspc}]\n+    }\n+\n+    # the upper half will have a paned window, a scroll bar to the right, and some stuff below\n+    frame .tf -height $geometry(topheight) -width $geometry(topwidth)\n+    frame .tf.histframe\n+    panedwindow .tf.histframe.pwclist -orient horizontal -sashpad 0 -handlesize 4\n+\n+    # create three canvases\n+    set cscroll .tf.histframe.csb\n+    set canv .tf.histframe.pwclist.canv\n+    canvas $canv -width $geometry(canv) \\\n \t-background $bgcolor -bd 0 \\\n \t-yscrollincr $linespc -yscrollcommand \"scrollcanv $cscroll\"\n-    .ctop.top.clist add $canv\n-    set canv2 .ctop.top.clist.canv2\n-    canvas $canv2 -height $geometry(canvh) -width $geometry(canv2) \\\n+    .tf.histframe.pwclist add $canv\n+    set canv2 .tf.histframe.pwclist.canv2\n+    canvas $canv2 -width $geometry(canv2) \\\n \t-background $bgcolor -bd 0 -yscrollincr $linespc\n-    .ctop.top.clist add $canv2\n-    set canv3 .ctop.top.clist.canv3\n-    canvas $canv3 -height $geometry(canvh) -width $geometry(canv3) \\\n+    .tf.histframe.pwclist add $canv2\n+    set canv3 .tf.histframe.pwclist.canv3\n+    canvas $canv3 -width $geometry(canv3) \\\n \t-background $bgcolor -bd 0 -yscrollincr $linespc\n-    .ctop.top.clist add $canv3\n-    bind .ctop.top.clist <Configure> {resizeclistpanes %W %w}\n+    .tf.histframe.pwclist add $canv3\n+\n+    # a scroll bar to rule them\n+    scrollbar $cscroll -command {allcanvs yview} -highlightthickness 0\n+    pack $cscroll -side right -fill y\n+    bind .tf.histframe.pwclist <Configure> {resizeclistpanes %W %w}\n     lappend bglist $canv $canv2 $canv3\n+    pack .tf.histframe.pwclist -fill both -expand 1 -side left\n+\n+    # we have two button bars at bottom of top frame. Bar 1\n+    frame .tf.bar\n+    frame .tf.lbar -height 15\n \n-    set sha1entry .ctop.top.bar.sha1\n+    set sha1entry .tf.bar.sha1\n     set entries $sha1entry\n-    set sha1but .ctop.top.bar.sha1label\n+    set sha1but .tf.bar.sha1label\n     button $sha1but -text \"SHA1 ID: \" -state disabled -relief flat \\\n \t-command gotocommit -width 8 -font $uifont\n     $sha1but conf -disabledforeground [$sha1but cget -foreground]\n-    pack .ctop.top.bar.sha1label -side left\n+    pack .tf.bar.sha1label -side left\n     entry $sha1entry -width 40 -font $textfont -textvariable sha1string\n     trace add variable sha1string write sha1change\n     pack $sha1entry -side left -pady 2\n@@ -505,91 +508,107 @@ proc makewindow {} {\n \t0x00, 0x38, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x00, 0x38, 0x00, 0x1c,\n \t0x00, 0x0e, 0x00, 0x07, 0x80, 0x03, 0xc0, 0x01};\n     }\n-    button .ctop.top.bar.leftbut -image bm-left -command goback \\\n+    button .tf.bar.leftbut -image bm-left -command goback \\\n \t-state disabled -width 26\n-    pack .ctop.top.bar.leftbut -side left -fill y\n-    button .ctop.top.bar.rightbut -image bm-right -command goforw \\\n+    pack .tf.bar.leftbut -side left -fill y\n+    button .tf.bar.rightbut -image bm-right -command goforw \\\n \t-state disabled -width 26\n-    pack .ctop.top.bar.rightbut -side left -fill y\n+    pack .tf.bar.rightbut -side left -fill y\n \n-    button .ctop.top.bar.findbut -text \"Find\" -command dofind -font $uifont\n-    pack .ctop.top.bar.findbut -side left\n+    button .tf.bar.findbut -text \"Find\" -command dofind -font $uifont\n+    pack .tf.bar.findbut -side left\n     set findstring {}\n-    set fstring .ctop.top.bar.findstring\n+    set fstring .tf.bar.findstring\n     lappend entries $fstring\n     entry $fstring -width 30 -font $textfont -textvariable findstring\n     trace add variable findstring write find_change\n-    pack $fstring -side left -expand 1 -fill x\n+    pack $fstring -side left -expand 1 -fill x -in .tf.bar\n     set findtype Exact\n-    set findtypemenu [tk_optionMenu .ctop.top.bar.findtype \\\n-\t\t\t  findtype Exact IgnCase Regexp]\n+    set findtypemenu [tk_optionMenu .tf.bar.findtype \\\n+\t\t      findtype Exact IgnCase Regexp]\n     trace add variable findtype write find_change\n-    .ctop.top.bar.findtype configure -font $uifont\n-    .ctop.top.bar.findtype.menu configure -font $uifont\n+    .tf.bar.findtype configure -font $uifont\n+    .tf.bar.findtype.menu configure -font $uifont\n     set findloc \"All fields\"\n-    tk_optionMenu .ctop.top.bar.findloc findloc \"All fields\" Headline \\\n+    tk_optionMenu .tf.bar.findloc findloc \"All fields\" Headline \\\n \tComments Author Committer\n     trace add variable findloc write find_change\n-    .ctop.top.bar.findloc configure -font $uifont\n-    .ctop.top.bar.findloc.menu configure -font $uifont\n-    pack .ctop.top.bar.findloc -side right\n-    pack .ctop.top.bar.findtype -side right\n+    .tf.bar.findloc configure -font $uifont\n+    .tf.bar.findloc.menu configure -font $uifont\n+    pack .tf.bar.findloc -side right\n+    pack .tf.bar.findtype -side right\n \n-    label .ctop.top.lbar.flabel -text \"Highlight:  Commits \" \\\n-\t-font $uifont\n-    pack .ctop.top.lbar.flabel -side left -fill y\n+    #-----------------\n+\n+    # build up the bottom bar of upper window\n+    label .tf.lbar.flabel -text \"Highlight:  Commits \" \\\n+    -font $uifont\n+    pack .tf.lbar.flabel -side left -fill y\n     set gdttype \"touching paths:\"\n-    set gm [tk_optionMenu .ctop.top.lbar.gdttype gdttype \"touching paths:\" \\\n-\t\t\"adding/removing string:\"]\n+    set gm [tk_optionMenu .tf.lbar.gdttype gdttype \"touching paths:\" \\\n+\t\"adding/removing string:\"]\n     trace add variable gdttype write hfiles_change\n     $gm conf -font $uifont\n-    .ctop.top.lbar.gdttype conf -font $uifont\n-    pack .ctop.top.lbar.gdttype -side left -fill y\n-    entry .ctop.top.lbar.fent -width 25 -font $textfont \\\n+    .tf.lbar.gdttype conf -font $uifont\n+    pack .tf.lbar.gdttype -side left -fill y\n+    entry .tf.lbar.fent -width 25 -font $textfont \\\n \t-textvariable highlight_files\n     trace add variable highlight_files write hfiles_change\n-    lappend entries .ctop.top.lbar.fent\n-    pack .ctop.top.lbar.fent -side left -fill x -expand 1\n-    label .ctop.top.lbar.vlabel -text \" OR in view\" -font $uifont\n-    pack .ctop.top.lbar.vlabel -side left -fill y\n+    lappend entries .tf.lbar.fent\n+    pack .tf.lbar.fent -side left -fill x -expand 1\n+    label .tf.lbar.vlabel -text \" OR in view\" -font $uifont\n+    pack .tf.lbar.vlabel -side left -fill y\n     global viewhlmenu selectedhlview\n-    set viewhlmenu [tk_optionMenu .ctop.top.lbar.vhl selectedhlview None]\n+    set viewhlmenu [tk_optionMenu .tf.lbar.vhl selectedhlview None]\n     $viewhlmenu entryconf None -command delvhighlight\n     $viewhlmenu conf -font $uifont\n-    .ctop.top.lbar.vhl conf -font $uifont\n-    pack .ctop.top.lbar.vhl -side left -fill y\n-    label .ctop.top.lbar.rlabel -text \" OR \" -font $uifont\n-    pack .ctop.top.lbar.rlabel -side left -fill y\n+    .tf.lbar.vhl conf -font $uifont\n+    pack .tf.lbar.vhl -side left -fill y\n+    label .tf.lbar.rlabel -text \" OR \" -font $uifont\n+    pack .tf.lbar.rlabel -side left -fill y\n     global highlight_related\n-    set m [tk_optionMenu .ctop.top.lbar.relm highlight_related None \\\n-\t       \"Descendent\" \"Not descendent\" \"Ancestor\" \"Not ancestor\"]\n+    set m [tk_optionMenu .tf.lbar.relm highlight_related None \\\n+\t\"Descendent\" \"Not descendent\" \"Ancestor\" \"Not ancestor\"]\n     $m conf -font $uifont\n-    .ctop.top.lbar.relm conf -font $uifont\n+    .tf.lbar.relm conf -font $uifont\n     trace add variable highlight_related write vrel_change\n-    pack .ctop.top.lbar.relm -side left -fill y\n-\n-    panedwindow .ctop.cdet -orient horizontal\n-    .ctop add .ctop.cdet\n-    frame .ctop.cdet.left\n-    frame .ctop.cdet.left.bot\n-    pack .ctop.cdet.left.bot -side bottom -fill x\n-    button .ctop.cdet.left.bot.search -text \"Search\" -command dosearch \\\n+    pack .tf.lbar.relm -side left -fill y\n+\n+    # Finish putting the upper half of the viewer together\n+    pack .tf.lbar -in .tf -side bottom -fill x\n+    pack .tf.bar -in .tf -side bottom -fill x\n+    pack .tf.histframe -fill both -side top -expand 1\n+    .ctop add .tf\n+\n+    # now build up the bottom\n+    panedwindow .pwbottom -orient horizontal\n+\n+    # lower left, a text box over search bar, scroll bar to the right\n+    # if we know window height, then that will set the lower text height, otherwise\n+    # we set lower text height which will drive window height\n+    if {[info exists geometry(main)]} {\n+        frame .bleft -width $geometry(botwidth)\n+    } else {\n+        frame .bleft -width $geometry(botwidth) -height $geometry(botheight)\n+    }\n+    frame .bleft.top\n+\n+    button .bleft.top.search -text \"Search\" -command dosearch \\\n \t-font $uifont\n-    pack .ctop.cdet.left.bot.search -side left -padx 5\n-    set sstring .ctop.cdet.left.bot.sstring\n+    pack .bleft.top.search -side left -padx 5\n+    set sstring .bleft.top.sstring\n     entry $sstring -width 20 -font $textfont -textvariable searchstring\n     lappend entries $sstring\n     trace add variable searchstring write incrsearch\n     pack $sstring -side left -expand 1 -fill x\n-    set ctext .ctop.cdet.left.ctext\n+    set ctext .bleft.ctext\n     text $ctext -background $bgcolor -foreground $fgcolor \\\n \t-state disabled -font $textfont \\\n-\t-width $geometry(ctextw) -height $geometry(ctexth) \\\n \t-yscrollcommand scrolltext -wrap none\n-    scrollbar .ctop.cdet.left.sb -command \"$ctext yview\"\n-    pack .ctop.cdet.left.sb -side right -fill y\n+    scrollbar .bleft.sb -command \"$ctext yview\"\n+    pack .bleft.top -side top -fill x\n+    pack .bleft.sb -side right -fill y\n     pack $ctext -side left -fill both -expand 1\n-    .ctop.cdet add .ctop.cdet.left\n     lappend bglist $ctext\n     lappend fglist $ctext\n \n@@ -620,36 +639,45 @@ proc makewindow {} {\n     $ctext tag conf msep -font [concat $textfont bold]\n     $ctext tag conf found -back yellow\n \n-    frame .ctop.cdet.right\n-    frame .ctop.cdet.right.mode\n-    radiobutton .ctop.cdet.right.mode.patch -text \"Patch\" \\\n+    .pwbottom add .bleft\n+\n+    # lower right\n+    frame .bright\n+    frame .bright.mode\n+    radiobutton .bright.mode.patch -text \"Patch\" \\\n \t-command reselectline -variable cmitmode -value \"patch\"\n-    radiobutton .ctop.cdet.right.mode.tree -text \"Tree\" \\\n+    radiobutton .bright.mode.tree -text \"Tree\" \\\n \t-command reselectline -variable cmitmode -value \"tree\"\n-    grid .ctop.cdet.right.mode.patch .ctop.cdet.right.mode.tree -sticky ew\n-    pack .ctop.cdet.right.mode -side top -fill x\n-    set cflist .ctop.cdet.right.cfiles\n+    grid .bright.mode.patch .bright.mode.tree -sticky ew\n+    pack .bright.mode -side top -fill x\n+    set cflist .bright.cfiles\n     set indent [font measure $mainfont \"nn\"]\n-    text $cflist -width $geometry(cflistw) \\\n+    text $cflist \\\n \t-background $bgcolor -foreground $fgcolor \\\n \t-font $mainfont \\\n \t-tabs [list $indent [expr {2 * $indent}]] \\\n-\t-yscrollcommand \".ctop.cdet.right.sb set\" \\\n+\t-yscrollcommand \".bright.sb set\" \\\n \t-cursor [. cget -cursor] \\\n \t-spacing1 1 -spacing3 1\n     lappend bglist $cflist\n     lappend fglist $cflist\n-    scrollbar .ctop.cdet.right.sb -command \"$cflist yview\"\n-    pack .ctop.cdet.right.sb -side right -fill y\n+    scrollbar .bright.sb -command \"$cflist yview\"\n+    pack .bright.sb -side right -fill y\n     pack $cflist -side left -fill both -expand 1\n     $cflist tag configure highlight \\\n \t-background [$cflist cget -selectbackground]\n     $cflist tag configure bold -font [concat $mainfont bold]\n-    .ctop.cdet add .ctop.cdet.right\n-    bind .ctop.cdet <Configure> {resizecdetpanes %W %w}\n \n-    pack .ctop -side top -fill both -expand 1\n+    .pwbottom add .bright\n+    .ctop add .pwbottom\n+\n+    # restore window position if known\n+    if {[info exists geometry(main)]} {\n+        wm geometry . \"$geometry(main)\"\n+    }\n \n+    bind .pwbottom <Configure> {resizecdetpanes %W %w}\n+    pack .ctop -fill both -expand 1\n     bindall <1> {selcanvline %W %x %y}\n     #bindall <B1-Motion> {selcanvline %W %x %y}\n     bindall <ButtonRelease-4> \"allcanvs yview scroll -5 units\"\n@@ -802,18 +830,16 @@ proc savestuff {w} {\n \tputs $f [list set fgcolor $fgcolor]\n \tputs $f [list set colors $colors]\n \tputs $f [list set diffcolors $diffcolors]\n-\tputs $f \"set geometry(width) [winfo width .ctop]\"\n-\tputs $f \"set geometry(height) [winfo height .ctop]\"\n-\tputs $f \"set geometry(canv1) [expr {[winfo width $canv]-2}]\"\n-\tputs $f \"set geometry(canv2) [expr {[winfo width $canv2]-2}]\"\n-\tputs $f \"set geometry(canv3) [expr {[winfo width $canv3]-2}]\"\n-\tputs $f \"set geometry(canvh) [expr {[winfo height $canv]-2}]\"\n-\tset wid [expr {([winfo width $ctext] - 8) \\\n-\t\t\t   / [font measure $textfont \"0\"]}]\n-\tputs $f \"set geometry(ctextw) $wid\"\n-\tset wid [expr {([winfo width $cflist] - 11) \\\n-\t\t\t   / [font measure [$cflist cget -font] \"0\"]}]\n-\tputs $f \"set geometry(cflistw) $wid\"\n+\n+        puts $f \"set geometry(main) [winfo geometry .]\"\n+\tputs $f \"set geometry(topwidth) [winfo width .tf]\"\n+\tputs $f \"set geometry(topheight) [winfo height .tf]\"\n+\tputs $f \"set geometry(canv) [expr {[winfo width $canv]-0}]\"\n+\tputs $f \"set geometry(canv2) [expr {[winfo width $canv2]-0}]\"\n+\tputs $f \"set geometry(canv3) [expr {[winfo width $canv3]-0}]\"\n+\tputs $f \"set geometry(botwidth) [winfo width .bleft]\"\n+\tputs $f \"set geometry(botheight) [winfo height .bleft]\"\n+\n \tputs -nonewline $f \"set permviews {\"\n \tfor {set v 0} {$v < $nextviewnum} {incr v} {\n \t    if {$viewperm($v)} {\n@@ -1402,7 +1428,7 @@ proc newview {ishighlight} {\n     set newviewname($nextviewnum) \"View $nextviewnum\"\n     set newviewperm($nextviewnum) 0\n     set newviewargs($nextviewnum) [shellarglist $revtreeargs]\n-    vieweditor $top $nextviewnum \"Gitk view definition\" \n+    vieweditor $top $nextviewnum \"Gitk view definition\"\n }\n \n proc editview {} {\n@@ -3897,7 +3923,7 @@ proc selectline {l isnew} {\n \t}\n \t$ctext insert end \"\\n\"\n     }\n- \n+\n     set headers {}\n     set olds [lindex $parentlist $l]\n     if {[llength $olds] > 1} {\n@@ -4006,7 +4032,7 @@ proc selnextpage {dir} {\n         set l [expr $numcommits - 1]\n     }\n     unmarkmatches\n-    selectline $l 1    \n+    selectline $l 1\n }\n \n proc unselectline {} {\n@@ -4043,11 +4069,11 @@ proc addtohistory {cmd} {\n     }\n     incr historyindex\n     if {$historyindex > 1} {\n-\t.ctop.top.bar.leftbut conf -state normal\n+\t.tf.bar.leftbut conf -state normal\n     } else {\n-\t.ctop.top.bar.leftbut conf -state disabled\n+\t.tf.bar.leftbut conf -state disabled\n     }\n-    .ctop.top.bar.rightbut conf -state disabled\n+    .tf.bar.rightbut conf -state disabled\n }\n \n proc godo {elt} {\n@@ -4067,10 +4093,10 @@ proc goback {} {\n     if {$historyindex > 1} {\n \tincr historyindex -1\n \tgodo [lindex $history [expr {$historyindex - 1}]]\n-\t.ctop.top.bar.rightbut conf -state normal\n+\t.tf.bar.rightbut conf -state normal\n     }\n     if {$historyindex <= 1} {\n-\t.ctop.top.bar.leftbut conf -state disabled\n+\t.tf.bar.leftbut conf -state disabled\n     }\n }\n \n@@ -4081,10 +4107,10 @@ proc goforw {} {\n \tset cmd [lindex $history $historyindex]\n \tincr historyindex\n \tgodo $cmd\n-\t.ctop.top.bar.leftbut conf -state normal\n+\t.tf.bar.leftbut conf -state normal\n     }\n     if {$historyindex >= [llength $history]} {\n-\t.ctop.top.bar.rightbut conf -state disabled\n+\t.tf.bar.rightbut conf -state disabled\n     }\n }\n \n@@ -4591,7 +4617,7 @@ proc searchmarkvisible {doall} {\n proc scrolltext {f0 f1} {\n     global searchstring\n \n-    .ctop.cdet.left.sb set $f0 $f1\n+    .bleft.sb set $f0 $f1\n     if {$searchstring ne {}} {\n \tsearchmarkvisible 0\n     }\n-- \n1.5.0.rc2.62.g874ea\n\n"},{"id":"33203","messageId":"7vk5z2r27s.fsf@assigned-by-dhcp.cox.net","threadId":"6595","inReplyTo":"45C14563.8060707@verizon.net","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Junio C Hamano","fromEmail":"junkio@cox.net","sentAt":"2007-02-01T03:22:47Z","receivedAt":"2007-02-01T03:22:47Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"I am not in X right now and won't be able to look at it myself\ntonight.  Could folks on MacOS comment on Mark's patch?\n"},{"id":"33209","messageId":"m264am5u1r.fsf@gmail.com","threadId":"6595","inReplyTo":"7vk5z2r27s.fsf@assigned-by-dhcp.cox.net","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Seth Falcon","fromEmail":"sethfalcon@gmail.com","sentAt":"2007-02-01T05:24:48Z","receivedAt":"2007-02-01T05:24:48Z","isPatch":true,"sender":{"key":"sethfalcon@gmail.com","avatar":"https://gravatar.com/avatar/fd62fe73d3013b12fce71d5269ec52eaca3c4cee479efc6eea3603d6f1d8bf8d?d=mp&s=160"},"body":"Junio C Hamano <junkio@cox.net> writes:\n\n> I am not in X right now and won't be able to look at it myself\n> tonight.  Could folks on MacOS comment on Mark's patch?\n\nI gave it a quick spin on OS X.  gitk loads with a different geometry\nthan it had before, but seems to work the same.  If this fixes things\nelsewhere, it seems fine here.\n\n+ seth\n"},{"id":"33212","messageId":"81b0412b0702010003t7becddf3x8fe6b36b0d84599b@mail.gmail.com","threadId":"6595","inReplyTo":"m264am5u1r.fsf@gmail.com","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Alex Riesen","fromEmail":"raa.lkml@gmail.com","sentAt":"2007-02-01T08:03:23Z","receivedAt":"2007-02-01T08:03:23Z","isPatch":true,"sender":{"key":"raa.lkml@gmail.com","avatar":"https://avatars.githubusercontent.com/u/324101?v=4"},"body":"On 2/1/07, Seth Falcon <sethfalcon@gmail.com> wrote:\n>\n> > I am not in X right now and won't be able to look at it myself\n> > tonight.  Could folks on MacOS comment on Mark's patch?\n>\n> I gave it a quick spin on OS X.  gitk loads with a different geometry\n> than it had before, but seems to work the same.  If this fixes things\n> elsewhere, it seems fine here.\n>\n\nFWIW, I confirm that. Much better. Mouse selection still does not\nwork in patch pane, but broken layout was the most annoying.\nThanks, Mark!\n"},{"id":"33216","messageId":"Pine.LNX.4.63.0702011016430.22628@wbgn013.biozentrum.uni-wuerzburg.de","threadId":"6595","inReplyTo":"45C14563.8060707@verizon.net","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2007-02-01T09:20:19Z","receivedAt":"2007-02-01T09:20:19Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Wed, 31 Jan 2007, Mark Levedahl wrote:\n\n> 1) Regarding the size of the patch. I tried many different approaches to \n> getting the layout to work on Cgywin as well as Linux, ultimately the \n> only approach that worked required changing the very top level structure \n> containing the Tk widgets. As the style used names all widgets using \n> their parents, every widget's name is changed. This makes the patch seem \n> more complex than it is, many changes are just changing names.\n\nWell, I don't like the size mainly because it makes it absolutely \nimpossible for me to review it. After 20 lines of just renamed widget \npaths I really lose all my concentration.\n\nAnd then I find that you also fixed whitespace breakage, which does not \nbelong in this patch.\n\nCiao,\nDscho\n"},{"id":"33233","messageId":"epsrj3$gh8$1@sea.gmane.org","threadId":"6595","inReplyTo":"Pine.LNX.4.63.0702011016430.22628@wbgn013.biozentrum.uni-wuerzburg.de","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Mark Levedahl","fromEmail":"mdl123@verizon.net","sentAt":"2007-02-01T13:56:48Z","receivedAt":"2007-02-01T13:56:48Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"\"Johannes Schindelin\" <Johannes.Schindelin@gmx.de> wrote in message \nnews:Pine.LNX.4.63.0702011016430.22628@wbgn013.biozentrum.uni-wuerzburg.de...\n> Hi,\n>\n> And then I find that you also fixed whitespace breakage, which does not\n> belong in this patch.\n>\n> Ciao,\n> Dscho\n>\nMy editor simply will not write out trailing whitespace so I do not notice when such breakage is fixed.\n\nIn the attached, I split out the four whitespace fixes in a separate patch.\n\nMark \n\n\nbegin 666 0002-Make-gitk-work-reasonably-well-on-Cygwin.patch\nM1G)O;2 S8S T,C4P-C$V9C!D965D.#@Q8V4Q-CDP93AC,3DU,&(Q-C0S8C W\nM($UO;B!397 @,3<@,# Z,# Z,# @,C P,0I&<F]M.B!-87)K($QE=F5D86AL\nM(#QM9&PQ,C- =F5R:7IO;BYN970^\"D1A=&4Z(%1H=2P@,2!&96(@,C P-R P\nM.#HT-CHS.\" M,#4P, I3=6)J96-T.B!;4$%40TA=($UA:V4@9VET:R!W;W)K\nM(')E87-O;F%B;'D@=V5L;\"!O;B!#>6=W:6XN\"@I4:&4@9VET:R!G=6D@;&%Y\nM;W5T('=A<R!C;VUP;&5T96QY(&)R;VME;B!O;B!#>6=W:6XN($EF(&=I=&L@\nM=V%S('-T87)T960*=VET:&]U=\"!P<F5V:6]U<R!G96]M971R>2!I;B!^+RYG\nM:71K+\"!T:&4@=7-E<B!C;W5L9\"!D<F%G('1H92!W:6YD;W<@<V%S:&5S\"G1O\nM(&=E=\"!A('5S96%B;&4@;&%Y;W5T+B!(;W=E=F5R+\"!I9B!^+RYG:71K(&5X\nM:7-T960L('1H:7,@=V%S(&YO=\"!P;W-S:6)L90IA=\"!A;&PN\"@I4:&4@9FEX\nM('=A<R!T;R!R97=R:71E(&UA:V5W:6YD;W<L(&-H86YG:6YG('1H92!T;W!L\nM979E;\"!C;VYT86EN97)S(&%N9 IT:&4@<&%R=&EC=6QA<B!G96]M971R>2!I\nM;F9O<FUA=&EO;B!S879E9\"!B971W965N('-E<W-I;VYS+B!.=6UE<F]U<R!B\nM=6=S\"FEN(&)O=&@@=&AE($-Y9W=I;B!A;F0@=&AE($QI;G5X(%1K('9E<G-I\nM;VYS(&UA:V4@=&AI<R!A(&1E;&EC871E\"F)A;&%N8VEN9R!A8W0Z('1H92!V\nM97)S:6]N(&AE<F4@=V]R:W,@:6X@8F]T:\"!B=70@;6%N>2!S=6)T;&4@=F%R\nM:6%N=',*87)E(&-O;7!E=&5L>2!B<F]K96X@:6X@;VYE(&]R('1H92!O=&AE\nM<B!E;G9I<F]N;65N=\"X*\"E1H<F5E('5S97(@=FES:6)L92!C:&%N9V5S(')E\nM<W5L=#H*,2 M(%1H92!V:65W97(@:7,@9G5L;'D@9G5N8W1I;VYA;\"!U;F1E\nM<B!#>6=W:6XN\"C(@+2!4:&4@<V5A<F-H(&)A<B!M;W9E<R!F<F]M('1H92!B\nM;W1T;VT@=&\\@=&AE('1O<\"!O9B!T:&4@;&]W97(@;&5F= H@(\" @<&%N92X@\nM5&AI<R!W87,@;F5C97-S87)Y('1O(&=E=\"!A<F]U;F0@82!L87EO=70@<')O\nM8FQE;2!O;B!#>6=W:6XN\"C,@+2!4:&4@=VEN9&]W('-I>F4@86YD('!O<VET\nM:6]N(&ES('-A=F5D(&%N9\"!R97-T;W)E9\"!B971W965N('-E<W-I;VYS+@H@\nM(\" @06=A:6XL('1H:7,@:7,@;F5C97-S87)Y('1O(&=E=\"!A<F]U;F0@82!L\nM87EO=70@<')O8FQE;2!O;B!#>6=W:6XN\"@I3:6=N960M;V9F+6)Y.B!-87)K\nM($QE=F5D86AL(#QM9&PQ,C- =F5R:7IO;BYN970^\"BTM+0H@9VET:R!\\(\" R\nM-S8@*RLK*RLK*RLK*RLK*RLK*RLK*RLK*RLK*RLK*RLK*RLK*RLK+2TM+2TM\nM+2TM+2TM+2TM+2TM+2TM+2TM+2TM+2TM\"B Q(&9I;&5S(&-H86YG960L(#$U\nM,\"!I;G-E<G1I;VYS*\"LI+\" Q,C8@9&5L971I;VYS*\"TI\"@ID:69F(\"TM9VET\nM(&$O9VET:R!B+V=I=&L*:6YD97@@-C4P-#,U92XN.#$S,C@Q,B Q,# W-34*\nM+2TM(&$O9VET:PHK*RL@8B]G:71K\"D! (\"TT,S4L-38@*S0S-2PU.2! 0\"!P\nM<F]C(&UA:V5W:6YD;W<@>WT@>PH@(\" @(\"YB87(N:&5L<\"!C;VYF:6=U<F4@\nM+69O;G0@)'5I9F]N= H@(\" @(\"X@8V]N9FEG=7)E(\"UM96YU(\"YB87(*( HM\nM(\" @(&EF('LA6VEN9F\\@97AI<W1S(&=E;VUE=')Y*&-A;G8Q*5U]('L*+0ES\nM970@9V5O;65T<GDH8V%N=C$I(%ME>'!R('LT-2 J(\"1C:&%R<W!C?5T*+0ES\nM970@9V5O;65T<GDH8V%N=C(I(%ME>'!R('LS,\" J(\"1C:&%R<W!C?5T*+0ES\nM970@9V5O;65T<GDH8V%N=C,I(%ME>'!R('LQ-2 J(\"1C:&%R<W!C?5T*+0ES\nM970@9V5O;65T<GDH8V%N=F@I(%ME>'!R('LR-2 J(\"1L:6YE<W!C(\"L@-'U=\nM\"BT)<V5T(&=E;VUE=')Y*&-T97AT=RD@.# *+0ES970@9V5O;65T<GDH8W1E\nM>'1H*2 S, HM\"7-E=\"!G96]M971R>2AC9FQI<W1W*2 S, HM(\" @('T**R @\nM(\" C('1H92!G=6D@:&%S('5P<&5R(&%N9\"!L;W=E<B!H86QF+\"!P87)T<R!O\nM9B!A('!A;F5D('=I;F1O=RX*(\" @(\"!P86YE9'=I;F1O=R N8W1O<\" M;W)I\nM96YT('9E<G1I8V%L\"BT@(\" @:68@>UMI;F9O(&5X:7-T<R!G96]M971R>2AW\nM:61T:\"E=?2![\"BT)+F-T;W @8V]N9B M=VED=&@@)&=E;VUE=')Y*'=I9'1H\nM*2 M:&5I9VAT(\"1G96]M971R>2AH96EG:'0I\"BT)<V5T('1E>'1H(%ME>'!R\nM('LD9V5O;65T<GDH:&5I9VAT*2 M(\"1G96]M971R>2AC86YV:\"D@+2 U-GU=\nM\"BT)<V5T(&=E;VUE=')Y*&-T97AT:\"D@6V5X<'(@>R@D=&5X=&@@+2 X*2 O\nM\"BT)\"0D)(\" @(%MF;VYT(&UE=')I8W,@)'1E>'1F;VYT(\"UL:6YE<W!A8V5=\nM?5T*+2 @(\"!]\"BT@(\" @9G)A;64@+F-T;W N=&]P\"BT@(\" @9G)A;64@+F-T\nM;W N=&]P+F)A<@HM(\" @(&9R86UE(\"YC=&]P+G1O<\"YL8F%R\"BT@(\" @<&%C\nM:R N8W1O<\"YT;W N;&)A<B M<VED92!B;W1T;VT@+69I;&P@> HM(\" @('!A\nM8VL@+F-T;W N=&]P+F)A<B M<VED92!B;W1T;VT@+69I;&P@> HM(\" @('-E\nM=\"!C<V-R;VQL(\"YC=&]P+G1O<\"YC<V(*+2 @(\"!S8W)O;&QB87(@)&-S8W)O\nM;&P@+6-O;6UA;F0@>V%L;&-A;G9S('EV:65W?2 M:&EG:&QI9VAT=&AI8VMN\nM97-S(# *+2 @(\"!P86-K(\"1C<V-R;VQL(\"US:61E(')I9VAT(\"UF:6QL('D*\nM+2 @(\"!P86YE9'=I;F1O=R N8W1O<\"YT;W N8VQI<W0@+6]R:65N=\"!H;W)I\nM>F]N=&%L(\"US87-H<&%D(# @+6AA;F1L97-I>F4@- HM(\" @('!A8VL@+F-T\nM;W N=&]P+F-L:7-T(\"US:61E('1O<\" M9FEL;\"!B;W1H(\"UE>'!A;F0@,0HM\nM(\" @(\"YC=&]P(&%D9\" N8W1O<\"YT;W *+2 @(\"!S970@8V%N=B N8W1O<\"YT\nM;W N8VQI<W0N8V%N=@HM(\" @(&-A;G9A<R D8V%N=B M:&5I9VAT(\"1G96]M\nM971R>2AC86YV:\"D@+7=I9'1H(\"1G96]M971R>2AC86YV,2D@7 HK\"BL@(\" @\nM(R!P;W-S:6)L>2!U<V4@87-S=6UE9\"!G96]M971R>0HK(\" @(&EF('LA6VEN\nM9F\\@97AI<W1S(&=E;VUE=')Y*'1O<&AE:6=H=\"E=?2![\"BL@(\" @(\" @('-E\nM=\"!G96]M971R>2AT;W!H96EG:'0I(%ME>'!R('LQ-2 J(\"1L:6YE<W!C?5T*\nM*R @(\" @(\" @<V5T(&=E;VUE=')Y*'1O<'=I9'1H*2!;97AP<B![.# @*B D\nM8VAA<G-P8WU=\"BL@(\" @(\" @('-E=\"!G96]M971R>2AB;W1H96EG:'0I(%ME\nM>'!R('LQ-2 J(\"1L:6YE<W!C?5T**R @(\" @(\" @<V5T(&=E;VUE=')Y*&)O\nM='=I9'1H*2!;97AP<B![-3 @*B D8VAA<G-P8WU=\"BL@(\" @(\" @('-E=\"!G\nM96]M971R>2AC86YV*2!;97AP<B![-# @*B D8VAA<G-P8WU=\"BL@(\" @(\" @\nM('-E=\"!G96]M971R>2AC86YV,BD@6V5X<'(@>S(P(\"H@)&-H87)S<&-]70HK\nM(\" @(\" @(\"!S970@9V5O;65T<GDH8V%N=C,I(%ME>'!R('LR,\" J(\"1C:&%R\nM<W!C?5T**R @(\"!]\"BL**R @(\" C('1H92!U<'!E<B!H86QF('=I;&P@:&%V\nM92!A('!A;F5D('=I;F1O=RP@82!S8W)O;&P@8F%R('1O('1H92!R:6=H=\"P@\nM86YD('-O;64@<W1U9F8@8F5L;W<**R @(\"!F<F%M92 N=&8@+6AE:6=H=\" D\nM9V5O;65T<GDH=&]P:&5I9VAT*2 M=VED=&@@)&=E;VUE=')Y*'1O<'=I9'1H\nM*0HK(\" @(&9R86UE(\"YT9BYH:7-T9G)A;64**R @(\"!P86YE9'=I;F1O=R N\nM=&8N:&ES=&9R86UE+G!W8VQI<W0@+6]R:65N=\"!H;W)I>F]N=&%L(\"US87-H\nM<&%D(# @+6AA;F1L97-I>F4@- HK\"BL@(\" @(R!C<F5A=&4@=&AR964@8V%N\nM=F%S97,**R @(\"!S970@8W-C<F]L;\" N=&8N:&ES=&9R86UE+F-S8@HK(\" @\nM('-E=\"!C86YV(\"YT9BYH:7-T9G)A;64N<'=C;&ES=\"YC86YV\"BL@(\" @8V%N\nM=F%S(\"1C86YV(\"UW:61T:\" D9V5O;65T<GDH8V%N=BD@7 H@\"2UB86-K9W)O\nM=6YD(\"1B9V-O;&]R(\"UB9\" P(%P*( DM>7-C<F]L;&EN8W(@)&QI;F5S<&,@\nM+7ES8W)O;&QC;VUM86YD(\")S8W)O;&QC86YV(\"1C<V-R;VQL(@HM(\" @(\"YC\nM=&]P+G1O<\"YC;&ES=\"!A9&0@)&-A;G8*+2 @(\"!S970@8V%N=C(@+F-T;W N\nM=&]P+F-L:7-T+F-A;G8R\"BT@(\" @8V%N=F%S(\"1C86YV,B M:&5I9VAT(\"1G\nM96]M971R>2AC86YV:\"D@+7=I9'1H(\"1G96]M971R>2AC86YV,BD@7 HK(\" @\nM(\"YT9BYH:7-T9G)A;64N<'=C;&ES=\"!A9&0@)&-A;G8**R @(\"!S970@8V%N\nM=C(@+G1F+FAI<W1F<F%M92YP=V-L:7-T+F-A;G8R\"BL@(\" @8V%N=F%S(\"1C\nM86YV,B M=VED=&@@)&=E;VUE=')Y*&-A;G8R*2!<\"B )+6)A8VMG<F]U;F0@\nM)&)G8V]L;W(@+6)D(# @+7ES8W)O;&QI;F-R(\"1L:6YE<W!C\"BT@(\" @+F-T\nM;W N=&]P+F-L:7-T(&%D9\" D8V%N=C(*+2 @(\"!S970@8V%N=C,@+F-T;W N\nM=&]P+F-L:7-T+F-A;G8S\"BT@(\" @8V%N=F%S(\"1C86YV,R M:&5I9VAT(\"1G\nM96]M971R>2AC86YV:\"D@+7=I9'1H(\"1G96]M971R>2AC86YV,RD@7 HK(\" @\nM(\"YT9BYH:7-T9G)A;64N<'=C;&ES=\"!A9&0@)&-A;G8R\"BL@(\" @<V5T(&-A\nM;G8S(\"YT9BYH:7-T9G)A;64N<'=C;&ES=\"YC86YV,PHK(\" @(&-A;G9A<R D\nM8V%N=C,@+7=I9'1H(\"1G96]M971R>2AC86YV,RD@7 H@\"2UB86-K9W)O=6YD\nM(\"1B9V-O;&]R(\"UB9\" P(\"UY<V-R;VQL:6YC<B D;&EN97-P8PHM(\" @(\"YC\nM=&]P+G1O<\"YC;&ES=\"!A9&0@)&-A;G8S\"BT@(\" @8FEN9\" N8W1O<\"YT;W N\nM8VQI<W0@/$-O;F9I9W5R93X@>W)E<VEZ96-L:7-T<&%N97,@)5<@)7=]\"BL@\nM(\" @+G1F+FAI<W1F<F%M92YP=V-L:7-T(&%D9\" D8V%N=C,**PHK(\" @(\",@\nM82!S8W)O;&P@8F%R('1O(')U;&4@=&AE;0HK(\" @('-C<F]L;&)A<B D8W-C\nM<F]L;\" M8V]M;6%N9\"![86QL8V%N=G,@>79I97=](\"UH:6=H;&EG:'1T:&EC\nM:VYE<W,@, HK(\" @('!A8VL@)&-S8W)O;&P@+7-I9&4@<FEG:'0@+69I;&P@\nM>0HK(\" @(&)I;F0@+G1F+FAI<W1F<F%M92YP=V-L:7-T(#Q#;VYF:6=U<F4^\nM('MR97-I>F5C;&ES='!A;F5S(\"57(\"5W?0H@(\" @(&QA<'!E;F0@8F=L:7-T\nM(\"1C86YV(\"1C86YV,B D8V%N=C,**R @(\"!P86-K(\"YT9BYH:7-T9G)A;64N\nM<'=C;&ES=\" M9FEL;\"!B;W1H(\"UE>'!A;F0@,2 M<VED92!L969T\"B *+2 @\nM(\"!S970@<VAA,65N=')Y(\"YC=&]P+G1O<\"YB87(N<VAA,0HK(\" @(\",@=V4@\nM:&%V92!T=V\\@8G5T=&]N(&)A<G,@870@8F]T=&]M(&]F('1O<\"!F<F%M92X@\nM0F%R(#$**R @(\"!F<F%M92 N=&8N8F%R\"BL@(\" @9G)A;64@+G1F+FQB87(@\nM+6AE:6=H=\" Q-0HK\"BL@(\" @<V5T('-H83%E;G1R>2 N=&8N8F%R+G-H83$*\nM(\" @(\"!S970@96YT<FEE<R D<VAA,65N=')Y\"BT@(\" @<V5T('-H83%B=70@\nM+F-T;W N=&]P+F)A<BYS:&$Q;&%B96P**R @(\"!S970@<VAA,6)U=\" N=&8N\nM8F%R+G-H83%L86)E; H@(\" @(&)U='1O;B D<VAA,6)U=\" M=&5X=\" B4TA!\nM,2!)1#H@(B M<W1A=&4@9&ES86)L960@+7)E;&EE9B!F;&%T(%P*( DM8V]M\nM;6%N9\"!G;W1O8V]M;6ET(\"UW:61T:\" X(\"UF;VYT(\"1U:69O;G0*(\" @(\" D\nM<VAA,6)U=\"!C;VYF(\"UD:7-A8FQE9&9O<F5G<F]U;F0@6R1S:&$Q8G5T(&-G\nM970@+69O<F5G<F]U;F1=\"BT@(\" @<&%C:R N8W1O<\"YT;W N8F%R+G-H83%L\nM86)E;\" M<VED92!L969T\"BL@(\" @<&%C:R N=&8N8F%R+G-H83%L86)E;\" M\nM<VED92!L969T\"B @(\" @96YT<GD@)'-H83%E;G1R>2 M=VED=&@@-# @+69O\nM;G0@)'1E>'1F;VYT(\"UT97AT=F%R:6%B;&4@<VAA,7-T<FEN9PH@(\" @('1R\nM86-E(&%D9\"!V87)I86)L92!S:&$Q<W1R:6YG('=R:71E('-H83%C:&%N9V4*\nM(\" @(\"!P86-K(\"1S:&$Q96YT<GD@+7-I9&4@;&5F=\" M<&%D>2 R\"D! (\"TU\nM,#4L.3$@*S4P.\"PQ,#4@0$ @<')O8R!M86ME=VEN9&]W('M]('L*( DP># P\nM+\" P>#,X+\" P>&9F+\" P>#=F+\" P>&9F+\" P>#=F+\" P>&9F+\" P>#=F+\" P\nM># P+\" P>#,X+\" P># P+\" P>#%C+ H@\"3!X,# L(#!X,&4L(#!X,# L(#!X\nM,#<L(#!X.# L(#!X,#,L(#!X8S L(#!X,#%].PH@(\" @('T*+2 @(\"!B=71T\nM;VX@+F-T;W N=&]P+F)A<BYL969T8G5T(\"UI;6%G92!B;2UL969T(\"UC;VUM\nM86YD(&=O8F%C:R!<\"BL@(\" @8G5T=&]N(\"YT9BYB87(N;&5F=&)U=\" M:6UA\nM9V4@8FTM;&5F=\" M8V]M;6%N9\"!G;V)A8VL@7 H@\"2US=&%T92!D:7-A8FQE\nM9\" M=VED=&@@,C8*+2 @(\"!P86-K(\"YC=&]P+G1O<\"YB87(N;&5F=&)U=\" M\nM<VED92!L969T(\"UF:6QL('D*+2 @(\"!B=71T;VX@+F-T;W N=&]P+F)A<BYR\nM:6=H=&)U=\" M:6UA9V4@8FTM<FEG:'0@+6-O;6UA;F0@9V]F;W)W(%P**R @\nM(\"!P86-K(\"YT9BYB87(N;&5F=&)U=\" M<VED92!L969T(\"UF:6QL('D**R @\nM(\"!B=71T;VX@+G1F+F)A<BYR:6=H=&)U=\" M:6UA9V4@8FTM<FEG:'0@+6-O\nM;6UA;F0@9V]F;W)W(%P*( DM<W1A=&4@9&ES86)L960@+7=I9'1H(#(V\"BT@\nM(\" @<&%C:R N8W1O<\"YT;W N8F%R+G)I9VAT8G5T(\"US:61E(&QE9G0@+69I\nM;&P@>0HK(\" @('!A8VL@+G1F+F)A<BYR:6=H=&)U=\" M<VED92!L969T(\"UF\nM:6QL('D*( HM(\" @(&)U='1O;B N8W1O<\"YT;W N8F%R+F9I;F1B=70@+71E\nM>'0@(D9I;F0B(\"UC;VUM86YD(&1O9FEN9\" M9F]N=\" D=6EF;VYT\"BT@(\" @\nM<&%C:R N8W1O<\"YT;W N8F%R+F9I;F1B=70@+7-I9&4@;&5F= HK(\" @(&)U\nM='1O;B N=&8N8F%R+F9I;F1B=70@+71E>'0@(D9I;F0B(\"UC;VUM86YD(&1O\nM9FEN9\" M9F]N=\" D=6EF;VYT\"BL@(\" @<&%C:R N=&8N8F%R+F9I;F1B=70@\nM+7-I9&4@;&5F= H@(\" @('-E=\"!F:6YD<W1R:6YG('M]\"BT@(\" @<V5T(&9S\nM=')I;F<@+F-T;W N=&]P+F)A<BYF:6YD<W1R:6YG\"BL@(\" @<V5T(&9S=')I\nM;F<@+G1F+F)A<BYF:6YD<W1R:6YG\"B @(\" @;&%P<&5N9\"!E;G1R:65S(\"1F\nM<W1R:6YG\"B @(\" @96YT<GD@)&9S=')I;F<@+7=I9'1H(#,P(\"UF;VYT(\"1T\nM97AT9F]N=\" M=&5X='9A<FEA8FQE(&9I;F1S=')I;F<*(\" @(\"!T<F%C92!A\nM9&0@=F%R:6%B;&4@9FEN9'-T<FEN9R!W<FET92!F:6YD7V-H86YG90HM(\" @\nM('!A8VL@)&9S=')I;F<@+7-I9&4@;&5F=\" M97AP86YD(#$@+69I;&P@> HK\nM(\" @('!A8VL@)&9S=')I;F<@+7-I9&4@;&5F=\" M97AP86YD(#$@+69I;&P@\nM>\" M:6X@+G1F+F)A<@H@(\" @('-E=\"!F:6YD='EP92!%>&%C= HM(\" @('-E\nM=\"!F:6YD='EP96UE;G4@6W1K7V]P=&EO;DUE;G4@+F-T;W N=&]P+F)A<BYF\nM:6YD='EP92!<\"BT)\"0D@(&9I;F1T>7!E($5X86-T($EG;D-A<V4@4F5G97AP\nM70HK(\" @('-E=\"!F:6YD='EP96UE;G4@6W1K7V]P=&EO;DUE;G4@+G1F+F)A\nM<BYF:6YD='EP92!<\"BL)\"2 @(\" @(&9I;F1T>7!E($5X86-T($EG;D-A<V4@\nM4F5G97AP70H@(\" @('1R86-E(&%D9\"!V87)I86)L92!F:6YD='EP92!W<FET\nM92!F:6YD7V-H86YG90HM(\" @(\"YC=&]P+G1O<\"YB87(N9FEN9'1Y<&4@8V]N\nM9FEG=7)E(\"UF;VYT(\"1U:69O;G0*+2 @(\" N8W1O<\"YT;W N8F%R+F9I;F1T\nM>7!E+FUE;G4@8V]N9FEG=7)E(\"UF;VYT(\"1U:69O;G0**R @(\" N=&8N8F%R\nM+F9I;F1T>7!E(&-O;F9I9W5R92 M9F]N=\" D=6EF;VYT\"BL@(\" @+G1F+F)A\nM<BYF:6YD='EP92YM96YU(&-O;F9I9W5R92 M9F]N=\" D=6EF;VYT\"B @(\" @\nM<V5T(&9I;F1L;V,@(D%L;\"!F:65L9',B\"BT@(\" @=&M?;W!T:6]N365N=2 N\nM8W1O<\"YT;W N8F%R+F9I;F1L;V,@9FEN9&QO8R B06QL(&9I96QD<R(@2&5A\nM9&QI;F4@7 HK(\" @('1K7V]P=&EO;DUE;G4@+G1F+F)A<BYF:6YD;&]C(&9I\nM;F1L;V,@(D%L;\"!F:65L9',B($AE861L:6YE(%P*( E#;VUM96YT<R!!=71H\nM;W(@0V]M;6ET=&5R\"B @(\" @=')A8V4@861D('9A<FEA8FQE(&9I;F1L;V,@\nM=W)I=&4@9FEN9%]C:&%N9V4*+2 @(\" N8W1O<\"YT;W N8F%R+F9I;F1L;V,@\nM8V]N9FEG=7)E(\"UF;VYT(\"1U:69O;G0*+2 @(\" N8W1O<\"YT;W N8F%R+F9I\nM;F1L;V,N;65N=2!C;VYF:6=U<F4@+69O;G0@)'5I9F]N= HM(\" @('!A8VL@\nM+F-T;W N=&]P+F)A<BYF:6YD;&]C(\"US:61E(')I9VAT\"BT@(\" @<&%C:R N\nM8W1O<\"YT;W N8F%R+F9I;F1T>7!E(\"US:61E(')I9VAT\"BT*+2 @(\"!L86)E\nM;\" N8W1O<\"YT;W N;&)A<BYF;&%B96P@+71E>'0@(DAI9VAL:6=H=#H@($-O\nM;6UI=',@(B!<\"BT)+69O;G0@)'5I9F]N= HM(\" @('!A8VL@+F-T;W N=&]P\nM+FQB87(N9FQA8F5L(\"US:61E(&QE9G0@+69I;&P@>0HK(\" @(\"YT9BYB87(N\nM9FEN9&QO8R!C;VYF:6=U<F4@+69O;G0@)'5I9F]N= HK(\" @(\"YT9BYB87(N\nM9FEN9&QO8RYM96YU(&-O;F9I9W5R92 M9F]N=\" D=6EF;VYT\"BL@(\" @<&%C\nM:R N=&8N8F%R+F9I;F1L;V,@+7-I9&4@<FEG:'0**R @(\"!P86-K(\"YT9BYB\nM87(N9FEN9'1Y<&4@+7-I9&4@<FEG:'0**PHK(\" @(\",@8G5I;&0@=7 @=&AE\nM(&)O='1O;2!B87(@;V8@=7!P97(@=VEN9&]W\"BL@(\" @;&%B96P@+G1F+FQB\nM87(N9FQA8F5L(\"UT97AT(\")(:6=H;&EG:'0Z(\"!#;VUM:71S(\"(@7 HK(\" @\nM(\"UF;VYT(\"1U:69O;G0**R @(\"!P86-K(\"YT9BYL8F%R+F9L86)E;\" M<VED\nM92!L969T(\"UF:6QL('D*(\" @(\"!S970@9V1T='EP92 B=&]U8VAI;F<@<&%T\nM:',Z(@HM(\" @('-E=\"!G;2!;=&M?;W!T:6]N365N=2 N8W1O<\"YT;W N;&)A\nM<BYG9'1T>7!E(&=D='1Y<&4@(G1O=6-H:6YG('!A=&AS.B(@7 HM\"0DB861D\nM:6YG+W)E;6]V:6YG('-T<FEN9SHB70HK(\" @('-E=\"!G;2!;=&M?;W!T:6]N\nM365N=2 N=&8N;&)A<BYG9'1T>7!E(&=D='1Y<&4@(G1O=6-H:6YG('!A=&AS\nM.B(@7 HK\"2)A9&1I;F<O<F5M;W9I;F<@<W1R:6YG.B)=\"B @(\" @=')A8V4@\nM861D('9A<FEA8FQE(&=D='1Y<&4@=W)I=&4@:&9I;&5S7V-H86YG90H@(\" @\nM(\"1G;2!C;VYF(\"UF;VYT(\"1U:69O;G0*+2 @(\" N8W1O<\"YT;W N;&)A<BYG\nM9'1T>7!E(&-O;F8@+69O;G0@)'5I9F]N= HM(\" @('!A8VL@+F-T;W N=&]P\nM+FQB87(N9V1T='EP92 M<VED92!L969T(\"UF:6QL('D*+2 @(\"!E;G1R>2 N\nM8W1O<\"YT;W N;&)A<BYF96YT(\"UW:61T:\" R-2 M9F]N=\" D=&5X=&9O;G0@\nM7 HK(\" @(\"YT9BYL8F%R+F=D='1Y<&4@8V]N9B M9F]N=\" D=6EF;VYT\"BL@\nM(\" @<&%C:R N=&8N;&)A<BYG9'1T>7!E(\"US:61E(&QE9G0@+69I;&P@>0HK\nM(\" @(&5N=')Y(\"YT9BYL8F%R+F9E;G0@+7=I9'1H(#(U(\"UF;VYT(\"1T97AT\nM9F]N=\"!<\"B )+71E>'1V87)I86)L92!H:6=H;&EG:'1?9FEL97,*(\" @(\"!T\nM<F%C92!A9&0@=F%R:6%B;&4@:&EG:&QI9VAT7V9I;&5S('=R:71E(&AF:6QE\nM<U]C:&%N9V4*+2 @(\"!L87!P96YD(&5N=')I97,@+F-T;W N=&]P+FQB87(N\nM9F5N= HM(\" @('!A8VL@+F-T;W N=&]P+FQB87(N9F5N=\" M<VED92!L969T\nM(\"UF:6QL('@@+65X<&%N9\" Q\"BT@(\" @;&%B96P@+F-T;W N=&]P+FQB87(N\nM=FQA8F5L(\"UT97AT(\"(@3U(@:6X@=FEE=R(@+69O;G0@)'5I9F]N= HM(\" @\nM('!A8VL@+F-T;W N=&]P+FQB87(N=FQA8F5L(\"US:61E(&QE9G0@+69I;&P@\nM>0HK(\" @(&QA<'!E;F0@96YT<FEE<R N=&8N;&)A<BYF96YT\"BL@(\" @<&%C\nM:R N=&8N;&)A<BYF96YT(\"US:61E(&QE9G0@+69I;&P@>\" M97AP86YD(#$*\nM*R @(\"!L86)E;\" N=&8N;&)A<BYV;&%B96P@+71E>'0@(B!/4B!I;B!V:65W\nM(B M9F]N=\" D=6EF;VYT\"BL@(\" @<&%C:R N=&8N;&)A<BYV;&%B96P@+7-I\nM9&4@;&5F=\" M9FEL;\"!Y\"B @(\" @9VQO8F%L('9I97=H;&UE;G4@<V5L96-T\nM961H;'9I97<*+2 @(\"!S970@=FEE=VAL;65N=2!;=&M?;W!T:6]N365N=2 N\nM8W1O<\"YT;W N;&)A<BYV:&P@<V5L96-T961H;'9I97<@3F]N95T**R @(\"!S\nM970@=FEE=VAL;65N=2!;=&M?;W!T:6]N365N=2 N=&8N;&)A<BYV:&P@<V5L\nM96-T961H;'9I97<@3F]N95T*(\" @(\" D=FEE=VAL;65N=2!E;G1R>6-O;F8@\nM3F]N92 M8V]M;6%N9\"!D96QV:&EG:&QI9VAT\"B @(\" @)'9I97=H;&UE;G4@\nM8V]N9B M9F]N=\" D=6EF;VYT\"BT@(\" @+F-T;W N=&]P+FQB87(N=FAL(&-O\nM;F8@+69O;G0@)'5I9F]N= HM(\" @('!A8VL@+F-T;W N=&]P+FQB87(N=FAL\nM(\"US:61E(&QE9G0@+69I;&P@>0HM(\" @(&QA8F5L(\"YC=&]P+G1O<\"YL8F%R\nM+G)L86)E;\" M=&5X=\" B($]2(\"(@+69O;G0@)'5I9F]N= HM(\" @('!A8VL@\nM+F-T;W N=&]P+FQB87(N<FQA8F5L(\"US:61E(&QE9G0@+69I;&P@>0HK(\" @\nM(\"YT9BYL8F%R+G9H;\"!C;VYF(\"UF;VYT(\"1U:69O;G0**R @(\"!P86-K(\"YT\nM9BYL8F%R+G9H;\" M<VED92!L969T(\"UF:6QL('D**R @(\"!L86)E;\" N=&8N\nM;&)A<BYR;&%B96P@+71E>'0@(B!/4B B(\"UF;VYT(\"1U:69O;G0**R @(\"!P\nM86-K(\"YT9BYL8F%R+G)L86)E;\" M<VED92!L969T(\"UF:6QL('D*(\" @(\"!G\nM;&]B86P@:&EG:&QI9VAT7W)E;&%T960*+2 @(\"!S970@;2!;=&M?;W!T:6]N\nM365N=2 N8W1O<\"YT;W N;&)A<BYR96QM(&AI9VAL:6=H=%]R96QA=&5D($YO\nM;F4@7 HM\"2 @(\" @(\" B1&5S8V5N9&5N=\"(@(DYO=\"!D97-C96YD96YT(B B\nM06YC97-T;W(B(\").;W0@86YC97-T;W(B70HK(\" @('-E=\"!M(%MT:U]O<'1I\nM;VY-96YU(\"YT9BYL8F%R+G)E;&T@:&EG:&QI9VAT7W)E;&%T960@3F]N92!<\nM\"BL)(D1E<V-E;F1E;G0B(\").;W0@9&5S8V5N9&5N=\"(@(D%N8V5S=&]R(B B\nM3F]T(&%N8V5S=&]R(ET*(\" @(\" D;2!C;VYF(\"UF;VYT(\"1U:69O;G0*+2 @\nM(\" N8W1O<\"YT;W N;&)A<BYR96QM(&-O;F8@+69O;G0@)'5I9F]N= HK(\" @\nM(\"YT9BYL8F%R+G)E;&T@8V]N9B M9F]N=\" D=6EF;VYT\"B @(\" @=')A8V4@\nM861D('9A<FEA8FQE(&AI9VAL:6=H=%]R96QA=&5D('=R:71E('9R96Q?8VAA\nM;F=E\"BT@(\" @<&%C:R N8W1O<\"YT;W N;&)A<BYR96QM(\"US:61E(&QE9G0@\nM+69I;&P@>0HM\"BT@(\" @<&%N961W:6YD;W<@+F-T;W N8V1E=\" M;W)I96YT\nM(&AO<FEZ;VYT86P*+2 @(\" N8W1O<\"!A9&0@+F-T;W N8V1E= HM(\" @(&9R\nM86UE(\"YC=&]P+F-D970N;&5F= HM(\" @(&9R86UE(\"YC=&]P+F-D970N;&5F\nM=\"YB;W0*+2 @(\"!P86-K(\"YC=&]P+F-D970N;&5F=\"YB;W0@+7-I9&4@8F]T\nM=&]M(\"UF:6QL('@*+2 @(\"!B=71T;VX@+F-T;W N8V1E=\"YL969T+F)O=\"YS\nM96%R8V@@+71E>'0@(E-E87)C:\"(@+6-O;6UA;F0@9&]S96%R8V@@7 HK(\" @\nM('!A8VL@+G1F+FQB87(N<F5L;2 M<VED92!L969T(\"UF:6QL('D**PHK(\" @\nM(\",@1FEN:7-H('!U='1I;F<@=&AE('5P<&5R(&AA;&8@;V8@=&AE('9I97=E\nM<B!T;V=E=&AE<@HK(\" @('!A8VL@+G1F+FQB87(@+6EN(\"YT9B M<VED92!B\nM;W1T;VT@+69I;&P@> HK(\" @('!A8VL@+G1F+F)A<B M:6X@+G1F(\"US:61E\nM(&)O='1O;2 M9FEL;\"!X\"BL@(\" @<&%C:R N=&8N:&ES=&9R86UE(\"UF:6QL\nM(&)O=&@@+7-I9&4@=&]P(\"UE>'!A;F0@,0HK(\" @(\"YC=&]P(&%D9\" N=&8*\nM*PHK(\" @(\",@;F]W(&)U:6QD('5P('1H92!B;W1T;VT**R @(\"!P86YE9'=I\nM;F1O=R N<'=B;W1T;VT@+6]R:65N=\"!H;W)I>F]N=&%L\"BL**R @(\" C(&QO\nM=V5R(&QE9G0L(&$@=&5X=\"!B;W@@;W9E<B!S96%R8V@@8F%R+\"!S8W)O;&P@\nM8F%R('1O('1H92!R:6=H= HK(\" @(\",@:68@=V4@:VYO=R!W:6YD;W<@:&5I\nM9VAT+\"!T:&5N('1H870@=VEL;\"!S970@=&AE(&QO=V5R('1E>'0@:&5I9VAT\nM+\"!O=&AE<G=I<V4**R @(\" C('=E('-E=\"!L;W=E<B!T97AT(&AE:6=H=\"!W\nM:&EC:\"!W:6QL(&1R:79E('=I;F1O=R!H96EG:'0**R @(\"!I9B![6VEN9F\\@\nM97AI<W1S(&=E;VUE=')Y*&UA:6XI77T@>PHK(\" @(\" @(\"!F<F%M92 N8FQE\nM9G0@+7=I9'1H(\"1G96]M971R>2AB;W1W:61T:\"D**R @(\"!](&5L<V4@>PHK\nM(\" @(\" @(\"!F<F%M92 N8FQE9G0@+7=I9'1H(\"1G96]M971R>2AB;W1W:61T\nM:\"D@+6AE:6=H=\" D9V5O;65T<GDH8F]T:&5I9VAT*0HK(\" @('T**R @(\"!F\nM<F%M92 N8FQE9G0N=&]P\"BL**R @(\"!B=71T;VX@+F)L969T+G1O<\"YS96%R\nM8V@@+71E>'0@(E-E87)C:\"(@+6-O;6UA;F0@9&]S96%R8V@@7 H@\"2UF;VYT\nM(\"1U:69O;G0*+2 @(\"!P86-K(\"YC=&]P+F-D970N;&5F=\"YB;W0N<V5A<F-H\nM(\"US:61E(&QE9G0@+7!A9'@@-0HM(\" @('-E=\"!S<W1R:6YG(\"YC=&]P+F-D\nM970N;&5F=\"YB;W0N<W-T<FEN9PHK(\" @('!A8VL@+F)L969T+G1O<\"YS96%R\nM8V@@+7-I9&4@;&5F=\" M<&%D>\" U\"BL@(\" @<V5T('-S=')I;F<@+F)L969T\nM+G1O<\"YS<W1R:6YG\"B @(\" @96YT<GD@)'-S=')I;F<@+7=I9'1H(#(P(\"UF\nM;VYT(\"1T97AT9F]N=\" M=&5X='9A<FEA8FQE('-E87)C:'-T<FEN9PH@(\" @\nM(&QA<'!E;F0@96YT<FEE<R D<W-T<FEN9PH@(\" @('1R86-E(&%D9\"!V87)I\nM86)L92!S96%R8VAS=')I;F<@=W)I=&4@:6YC<G-E87)C: H@(\" @('!A8VL@\nM)'-S=')I;F<@+7-I9&4@;&5F=\" M97AP86YD(#$@+69I;&P@> HM(\" @('-E\nM=\"!C=&5X=\" N8W1O<\"YC9&5T+FQE9G0N8W1E>'0**R @(\"!S970@8W1E>'0@\nM+F)L969T+F-T97AT\"B @(\" @=&5X=\" D8W1E>'0@+6)A8VMG<F]U;F0@)&)G\nM8V]L;W(@+69O<F5G<F]U;F0@)&9G8V]L;W(@7 H@\"2US=&%T92!D:7-A8FQE\nM9\" M9F]N=\" D=&5X=&9O;G0@7 HM\"2UW:61T:\" D9V5O;65T<GDH8W1E>'1W\nM*2 M:&5I9VAT(\"1G96]M971R>2AC=&5X=&@I(%P*( DM>7-C<F]L;&-O;6UA\nM;F0@<V-R;VQL=&5X=\" M=W)A<\"!N;VYE\"BT@(\" @<V-R;VQL8F%R(\"YC=&]P\nM+F-D970N;&5F=\"YS8B M8V]M;6%N9\" B)&-T97AT('EV:65W(@HM(\" @('!A\nM8VL@+F-T;W N8V1E=\"YL969T+G-B(\"US:61E(')I9VAT(\"UF:6QL('D**R @\nM(\"!S8W)O;&QB87(@+F)L969T+G-B(\"UC;VUM86YD(\"(D8W1E>'0@>79I97<B\nM\"BL@(\" @<&%C:R N8FQE9G0N=&]P(\"US:61E('1O<\" M9FEL;\"!X\"BL@(\" @\nM<&%C:R N8FQE9G0N<V(@+7-I9&4@<FEG:'0@+69I;&P@>0H@(\" @('!A8VL@\nM)&-T97AT(\"US:61E(&QE9G0@+69I;&P@8F]T:\" M97AP86YD(#$*+2 @(\" N\nM8W1O<\"YC9&5T(&%D9\" N8W1O<\"YC9&5T+FQE9G0*(\" @(\"!L87!P96YD(&)G\nM;&ES=\" D8W1E>'0*(\" @(\"!L87!P96YD(&9G;&ES=\" D8W1E>'0*( I 0\" M\nM-C(P+#,V(\"LV,S<L-#4@0$ @<')O8R!M86ME=VEN9&]W('M]('L*(\" @(\" D\nM8W1E>'0@=&%G(&-O;F8@;7-E<\" M9F]N=\"!;8V]N8V%T(\"1T97AT9F]N=\"!B\nM;VQD70H@(\" @(\"1C=&5X=\"!T86<@8V]N9B!F;W5N9\" M8F%C:R!Y96QL;W<*\nM( HM(\" @(&9R86UE(\"YC=&]P+F-D970N<FEG:'0*+2 @(\"!F<F%M92 N8W1O\nM<\"YC9&5T+G)I9VAT+FUO9&4*+2 @(\"!R861I;V)U='1O;B N8W1O<\"YC9&5T\nM+G)I9VAT+FUO9&4N<&%T8V@@+71E>'0@(E!A=&-H(B!<\"BL@(\" @+G!W8F]T\nM=&]M(&%D9\" N8FQE9G0**PHK(\" @(\",@;&]W97(@<FEG:'0**R @(\"!F<F%M\nM92 N8G)I9VAT\"BL@(\" @9G)A;64@+F)R:6=H=\"YM;V1E\"BL@(\" @<F%D:6]B\nM=71T;VX@+F)R:6=H=\"YM;V1E+G!A=&-H(\"UT97AT(\")0871C:\"(@7 H@\"2UC\nM;VUM86YD(')E<V5L96-T;&EN92 M=F%R:6%B;&4@8VUI=&UO9&4@+79A;'5E\nM(\")P871C:\"(*+2 @(\"!R861I;V)U='1O;B N8W1O<\"YC9&5T+G)I9VAT+FUO\nM9&4N=')E92 M=&5X=\" B5')E92(@7 HK(\" @(')A9&EO8G5T=&]N(\"YB<FEG\nM:'0N;6]D92YT<F5E(\"UT97AT(\")4<F5E(B!<\"B )+6-O;6UA;F0@<F5S96QE\nM8W1L:6YE(\"UV87)I86)L92!C;6ET;6]D92 M=F%L=64@(G1R964B\"BT@(\" @\nM9W)I9\" N8W1O<\"YC9&5T+G)I9VAT+FUO9&4N<&%T8V@@+F-T;W N8V1E=\"YR\nM:6=H=\"YM;V1E+G1R964@+7-T:6-K>2!E=PHM(\" @('!A8VL@+F-T;W N8V1E\nM=\"YR:6=H=\"YM;V1E(\"US:61E('1O<\" M9FEL;\"!X\"BT@(\" @<V5T(&-F;&ES\nM=\" N8W1O<\"YC9&5T+G)I9VAT+F-F:6QE<PHK(\" @(&=R:60@+F)R:6=H=\"YM\nM;V1E+G!A=&-H(\"YB<FEG:'0N;6]D92YT<F5E(\"US=&EC:WD@97<**R @(\"!P\nM86-K(\"YB<FEG:'0N;6]D92 M<VED92!T;W @+69I;&P@> HK(\" @('-E=\"!C\nM9FQI<W0@+F)R:6=H=\"YC9FEL97,*(\" @(\"!S970@:6YD96YT(%MF;VYT(&UE\nM87-U<F4@)&UA:6YF;VYT(\")N;B)=\"BT@(\" @=&5X=\" D8V9L:7-T(\"UW:61T\nM:\" D9V5O;65T<GDH8V9L:7-T=RD@7 HK(\" @('1E>'0@)&-F;&ES=\"!<\"B )\nM+6)A8VMG<F]U;F0@)&)G8V]L;W(@+69O<F5G<F]U;F0@)&9G8V]L;W(@7 H@\nM\"2UF;VYT(\"1M86EN9F]N=\"!<\"B )+71A8G,@6VQI<W0@)&EN9&5N=\"!;97AP\nM<B![,B J(\"1I;F1E;G1]75T@7 HM\"2UY<V-R;VQL8V]M;6%N9\" B+F-T;W N\nM8V1E=\"YR:6=H=\"YS8B!S970B(%P**PDM>7-C<F]L;&-O;6UA;F0@(BYB<FEG\nM:'0N<V(@<V5T(B!<\"B )+6-U<G-O<B!;+B!C9V5T(\"UC=7)S;W)=(%P*( DM\nM<W!A8VEN9S$@,2 M<W!A8VEN9S,@,0H@(\" @(&QA<'!E;F0@8F=L:7-T(\"1C\nM9FQI<W0*(\" @(\"!L87!P96YD(&9G;&ES=\" D8V9L:7-T\"BT@(\" @<V-R;VQL\nM8F%R(\"YC=&]P+F-D970N<FEG:'0N<V(@+6-O;6UA;F0@(B1C9FQI<W0@>79I\nM97<B\"BT@(\" @<&%C:R N8W1O<\"YC9&5T+G)I9VAT+G-B(\"US:61E(')I9VAT\nM(\"UF:6QL('D**R @(\"!S8W)O;&QB87(@+F)R:6=H=\"YS8B M8V]M;6%N9\" B\nM)&-F;&ES=\"!Y=FEE=R(**R @(\"!P86-K(\"YB<FEG:'0N<V(@+7-I9&4@<FEG\nM:'0@+69I;&P@>0H@(\" @('!A8VL@)&-F;&ES=\" M<VED92!L969T(\"UF:6QL\nM(&)O=&@@+65X<&%N9\" Q\"B @(\" @)&-F;&ES=\"!T86<@8V]N9FEG=7)E(&AI\nM9VAL:6=H=\"!<\"B )+6)A8VMG<F]U;F0@6R1C9FQI<W0@8V=E=\" M<V5L96-T\nM8F%C:V=R;W5N9%T*(\" @(\" D8V9L:7-T('1A9R!C;VYF:6=U<F4@8F]L9\" M\nM9F]N=\"!;8V]N8V%T(\"1M86EN9F]N=\"!B;VQD70HM(\" @(\"YC=&]P+F-D970@\nM861D(\"YC=&]P+F-D970N<FEG:'0*+2 @(\"!B:6YD(\"YC=&]P+F-D970@/$-O\nM;F9I9W5R93X@>W)E<VEZ96-D971P86YE<R E5R E=WT*( HM(\" @('!A8VL@\nM+F-T;W @+7-I9&4@=&]P(\"UF:6QL(&)O=&@@+65X<&%N9\" Q\"BL@(\" @+G!W\nM8F]T=&]M(&%D9\" N8G)I9VAT\"BL@(\" @+F-T;W @861D(\"YP=V)O='1O;0H@\nM\"BL@(\" @(R!R97-T;W)E('=I;F1O=R!P;W-I=&EO;B!I9B!K;F]W;@HK(\" @\nM(&EF('M;:6YF;R!E>&ES=',@9V5O;65T<GDH;6%I;BE=?2![\"BL@(\" @(\" @\nM('=M(&=E;VUE=')Y(\"X@(B1G96]M971R>2AM86EN*2(**R @(\"!]\"BL**R @\nM(\"!B:6YD(\"YP=V)O='1O;2 \\0V]N9FEG=7)E/B![<F5S:7IE8V1E='!A;F5S\nM(\"57(\"5W?0HK(\" @('!A8VL@+F-T;W @+69I;&P@8F]T:\" M97AP86YD(#$*\nM(\" @(\"!B:6YD86QL(#PQ/B![<V5L8V%N=FQI;F4@)5<@)7@@)7E]\"B @(\" @\nM(V)I;F1A;&P@/$(Q+4UO=&EO;CX@>W-E;&-A;G9L:6YE(\"57(\"5X(\"5Y?0H@\nM(\" @(&)I;F1A;&P@/$)U='1O;E)E;&5A<V4M-#X@(F%L;&-A;G9S('EV:65W\nM('-C<F]L;\" M-2!U;FET<R(*0$ @+3@P,BPQ.\" K.#(X+#$V($! ('!R;V,@\nM<V%V97-T=69F('MW?2![\"B )<'5T<R D9B!;;&ES=\"!S970@9F=C;VQO<B D\nM9F=C;VQO<ET*( EP=71S(\"1F(%ML:7-T('-E=\"!C;VQO<G,@)&-O;&]R<UT*\nM( EP=71S(\"1F(%ML:7-T('-E=\"!D:69F8V]L;W)S(\"1D:69F8V]L;W)S70HM\nM\"7!U=',@)&8@(G-E=\"!G96]M971R>2AW:61T:\"D@6W=I;F9O('=I9'1H(\"YC\nM=&]P72(*+0EP=71S(\"1F(\")S970@9V5O;65T<GDH:&5I9VAT*2!;=VEN9F\\@\nM:&5I9VAT(\"YC=&]P72(*+0EP=71S(\"1F(\")S970@9V5O;65T<GDH8V%N=C$I\nM(%ME>'!R('M;=VEN9F\\@=VED=&@@)&-A;G9=+3)]72(*+0EP=71S(\"1F(\")S\nM970@9V5O;65T<GDH8V%N=C(I(%ME>'!R('M;=VEN9F\\@=VED=&@@)&-A;G8R\nM72TR?5TB\"BT)<'5T<R D9B B<V5T(&=E;VUE=')Y*&-A;G8S*2!;97AP<B![\nM6W=I;F9O('=I9'1H(\"1C86YV,UTM,GU=(@HM\"7!U=',@)&8@(G-E=\"!G96]M\nM971R>2AC86YV:\"D@6V5X<'(@>UMW:6YF;R!H96EG:'0@)&-A;G9=+3)]72(*\nM+0ES970@=VED(%ME>'!R('LH6W=I;F9O('=I9'1H(\"1C=&5X=%T@+2 X*2!<\nM\"BT)\"0D@(\" O(%MF;VYT(&UE87-U<F4@)'1E>'1F;VYT(\"(P(EU]70HM\"7!U\nM=',@)&8@(G-E=\"!G96]M971R>2AC=&5X='<I(\"1W:60B\"BT)<V5T('=I9\"!;\nM97AP<B![*%MW:6YF;R!W:61T:\" D8V9L:7-T72 M(#$Q*2!<\"BT)\"0D@(\" O\nM(%MF;VYT(&UE87-U<F4@6R1C9FQI<W0@8V=E=\" M9F]N=%T@(C B77U=\"BT)\nM<'5T<R D9B B<V5T(&=E;VUE=')Y*&-F;&ES='<I(\"1W:60B\"BL**R @(\" @\nM(\" @<'5T<R D9B B<V5T(&=E;VUE=')Y*&UA:6XI(%MW:6YF;R!G96]M971R\nM>2 N72(**PEP=71S(\"1F(\")S970@9V5O;65T<GDH=&]P=VED=&@I(%MW:6YF\nM;R!W:61T:\" N=&9=(@HK\"7!U=',@)&8@(G-E=\"!G96]M971R>2AT;W!H96EG\nM:'0I(%MW:6YF;R!H96EG:'0@+G1F72(**PEP=71S(\"1F(\")S970@9V5O;65T\nM<GDH8V%N=BD@6V5X<'(@>UMW:6YF;R!W:61T:\" D8V%N=ETM,'U=(@HK\"7!U\nM=',@)&8@(G-E=\"!G96]M971R>2AC86YV,BD@6V5X<'(@>UMW:6YF;R!W:61T\nM:\" D8V%N=C)=+3!]72(**PEP=71S(\"1F(\")S970@9V5O;65T<GDH8V%N=C,I\nM(%ME>'!R('M;=VEN9F\\@=VED=&@@)&-A;G8S72TP?5TB\"BL)<'5T<R D9B B\nM<V5T(&=E;VUE=')Y*&)O='=I9'1H*2!;=VEN9F\\@=VED=&@@+F)L969T72(*\nM*PEP=71S(\"1F(\")S970@9V5O;65T<GDH8F]T:&5I9VAT*2!;=VEN9F\\@:&5I\nM9VAT(\"YB;&5F=%TB\"BL*( EP=71S(\"UN;VYE=VQI;F4@)&8@(G-E=\"!P97)M\nM=FEE=W,@>R(*( EF;W(@>W-E=\"!V(#!]('LD=B \\(\"1N97AT=FEE=VYU;7T@\nM>VEN8W(@=GT@>PH@\"2 @(\"!I9B![)'9I97=P97)M*\"1V*7T@>PI 0\" M-# T\nM,RPQ,2 K-# V-RPQ,2! 0\"!P<F]C(&%D9'1O:&ES=&]R>2![8VUD?2![\"B @\nM(\" @?0H@(\" @(&EN8W(@:&ES=&]R>6EN9&5X\"B @(\" @:68@>R1H:7-T;W)Y\nM:6YD97@@/B Q?2![\"BT)+F-T;W N=&]P+F)A<BYL969T8G5T(&-O;F8@+7-T\nM871E(&YO<FUA; HK\"2YT9BYB87(N;&5F=&)U=\"!C;VYF(\"US=&%T92!N;W)M\nM86P*(\" @(\"!](&5L<V4@>PHM\"2YC=&]P+G1O<\"YB87(N;&5F=&)U=\"!C;VYF\nM(\"US=&%T92!D:7-A8FQE9 HK\"2YT9BYB87(N;&5F=&)U=\"!C;VYF(\"US=&%T\nM92!D:7-A8FQE9 H@(\" @('T*+2 @(\" N8W1O<\"YT;W N8F%R+G)I9VAT8G5T\nM(&-O;F8@+7-T871E(&1I<V%B;&5D\"BL@(\" @+G1F+F)A<BYR:6=H=&)U=\"!C\nM;VYF(\"US=&%T92!D:7-A8FQE9 H@?0H@\"B!P<F]C(&=O9&\\@>V5L='T@>PI \nM0\" M-# V-RPQ,\" K-# Y,2PQ,\"! 0\"!P<F]C(&=O8F%C:R![?2![\"B @(\" @\nM:68@>R1H:7-T;W)Y:6YD97@@/B Q?2![\"B ):6YC<B!H:7-T;W)Y:6YD97@@\nM+3$*( EG;V1O(%ML:6YD97@@)&AI<W1O<GD@6V5X<'(@>R1H:7-T;W)Y:6YD\nM97@@+2 Q?5U=\"BT)+F-T;W N=&]P+F)A<BYR:6=H=&)U=\"!C;VYF(\"US=&%T\nM92!N;W)M86P**PDN=&8N8F%R+G)I9VAT8G5T(&-O;F8@+7-T871E(&YO<FUA\nM; H@(\" @('T*(\" @(\"!I9B![)&AI<W1O<GEI;F1E>\" \\/2 Q?2![\"BT)+F-T\nM;W N=&]P+F)A<BYL969T8G5T(&-O;F8@+7-T871E(&1I<V%B;&5D\"BL)+G1F\nM+F)A<BYL969T8G5T(&-O;F8@+7-T871E(&1I<V%B;&5D\"B @(\" @?0H@?0H@\nM\"D! (\"TT,#@Q+#$P(\"LT,3 U+#$P($! ('!R;V,@9V]F;W)W('M]('L*( ES\nM970@8VUD(%ML:6YD97@@)&AI<W1O<GD@)&AI<W1O<GEI;F1E>%T*( EI;F-R\nM(&AI<W1O<GEI;F1E> H@\"6=O9&\\@)&-M9 HM\"2YC=&]P+G1O<\"YB87(N;&5F\nM=&)U=\"!C;VYF(\"US=&%T92!N;W)M86P**PDN=&8N8F%R+FQE9G1B=70@8V]N\nM9B M<W1A=&4@;F]R;6%L\"B @(\" @?0H@(\" @(&EF('LD:&ES=&]R>6EN9&5X\nM(#X](%ML;&5N9W1H(\"1H:7-T;W)Y77T@>PHM\"2YC=&]P+G1O<\"YB87(N<FEG\nM:'1B=70@8V]N9B M<W1A=&4@9&ES86)L960**PDN=&8N8F%R+G)I9VAT8G5T\nM(&-O;F8@+7-T871E(&1I<V%B;&5D\"B @(\" @?0H@?0H@\"D! (\"TT-3DQ+#<@\nM*S0V,34L-R! 0\"!P<F]C('-E87)C:&UA<FMV:7-I8FQE('MD;V%L;'T@>PH@\nM<')O8R!S8W)O;&QT97AT('MF,\"!F,7T@>PH@(\" @(&=L;V)A;\"!S96%R8VAS\nM=')I;F<*( HM(\" @(\"YC=&]P+F-D970N;&5F=\"YS8B!S970@)&8P(\"1F,0HK\nM(\" @(\"YB;&5F=\"YS8B!S970@)&8P(\"1F,0H@(\" @(&EF('LD<V5A<F-H<W1R\nM:6YG(&YE('M]?2![\"B )<V5A<F-H;6%R:W9I<VEB;&4@, H@(\" @('T*+2T@\n;\"C$N-2XP+G)C,BXW-BYG-&9C,\"UD:7)T>0H*\n`\nend\n\nbegin 666 0001-gitk-remove-trailing-whitespace-from-a-few-lines.patch\nM1G)O;2 S9F,P93@S8C$X9#4R.&%C-65C96(U8V,U8C4T,#1F830W9F$V.6$U\nM($UO;B!397 @,3<@,# Z,# Z,# @,C P,0I&<F]M.B!-87)K($QE=F5D86AL\nM(#QM9&PQ,C- =F5R:7IO;BYN970^\"D1A=&4Z(%1H=2P@,2!&96(@,C P-R P\nM.#HT-#HT-B M,#4P, I3=6)J96-T.B!;4$%40TA=(&=I=&L@+2!R96UO=F4@\nM=')A:6QI;F<@=VAI=&5S<&%C92!F<F]M(&$@9F5W(&QI;F5S+@H*4VEG;F5D\nM+6]F9BUB>3H@36%R:R!,979E9&%H;\" \\;61L,3(S0'9E<FEZ;VXN;F5T/@HM\nM+2T*(&=I=&L@?\" @(\" X(\"LK*RLM+2TM\"B Q(&9I;&5S(&-H86YG960L(#0@\nM:6YS97)T:6]N<R@K*2P@-\"!D96QE=&EO;G,H+2D*\"F1I9F8@+2UG:70@82]G\nM:71K(&(O9VET:PII;F1E>\" S,60P86%D+BXV-3 T,S5E(#$P,#<U-0HM+2T@\nM82]G:71K\"BLK*R!B+V=I=&L*0$ @+30R-RPW(\"LT,C<L-R! 0\"!P<F]C(&UA\nM:V5W:6YD;W<@>WT@>PH@(\" @(\"YB87(N=FEE=R!A9&0@<V5P87)A=&]R\"B @\nM(\" @+F)A<BYV:65W(&%D9\"!R861I;V)U='1O;B M;&%B96P@(D%L;\"!F:6QE\nM<R(@+6-O;6UA;F0@>W-H;W=V:65W(#!](%P*( DM=F%R:6%B;&4@<V5L96-T\nM961V:65W(\"UV86QU92 P\"BT@(\" @\"BL*(\" @(\"!M96YU(\"YB87(N:&5L< H@\nM(\" @(\"YB87(@861D(&-A<V-A9&4@+6QA8F5L(\")(96QP(B M;65N=2 N8F%R\nM+FAE;' *(\" @(\" N8F%R+FAE;' @861D(&-O;6UA;F0@+6QA8F5L(\")!8F]U\nM=\"!G:71K(B M8V]M;6%N9\"!A8F]U= I 0\" M,30P,BPW(\"LQ-# R+#<@0$ @\nM<')O8R!N97=V:65W('MI<VAI9VAL:6=H='T@>PH@(\" @('-E=\"!N97=V:65W\nM;F%M92@D;F5X='9I97=N=6TI(\")6:65W(\"1N97AT=FEE=VYU;2(*(\" @(\"!S\nM970@;F5W=FEE=W!E<FTH)&YE>'1V:65W;G5M*2 P\"B @(\" @<V5T(&YE=W9I\nM97=A<F=S*\"1N97AT=FEE=VYU;2D@6W-H96QL87)G;&ES=\" D<F5V=')E96%R\nM9W-=\"BT@(\" @=FEE=V5D:71O<B D=&]P(\"1N97AT=FEE=VYU;2 B1VET:R!V\nM:65W(&1E9FEN:71I;VXB( HK(\" @('9I97=E9&ET;W(@)'1O<\" D;F5X='9I\nM97=N=6T@(D=I=&L@=FEE=R!D969I;FET:6]N(@H@?0H@\"B!P<F]C(&5D:71V\nM:65W('M]('L*0$ @+3,X.3<L-R K,S@Y-RPW($! ('!R;V,@<V5L96-T;&EN\nM92![;\"!I<VYE=WT@>PH@\"7T*( DD8W1E>'0@:6YS97)T(&5N9\" B7&XB\"B @\nM(\" @?0HM( HK\"B @(\" @<V5T(&AE861E<G,@>WT*(\" @(\"!S970@;VQD<R!;\nM;&EN9&5X(\"1P87)E;G1L:7-T(\"1L70H@(\" @(&EF('M;;&QE;F=T:\" D;VQD\nM<UT@/B Q?2![\"D! (\"TT,# V+#<@*S0P,#8L-R! 0\"!P<F]C('-E;&YE>'1P\nM86=E('MD:7)]('L*(\" @(\" @(\" @<V5T(&P@6V5X<'(@)&YU;6-O;6UI=',@\nM+2 Q70H@(\" @('T*(\" @(\"!U;FUA<FMM871C:&5S\"BT@(\" @<V5L96-T;&EN\nM92 D;\" Q(\" @( HK(\" @('-E;&5C=&QI;F4@)&P@,0H@?0H@\"B!P<F]C('5N\nM<V5L96-T;&EN92![?2![\"BTM( HQ+C4N,\"YR8S(N-S8N9S1F8S M9&ER='D*\n!\"@``\n`\nend\n"},{"id":"33236","messageId":"epsrvd$i4p$1@sea.gmane.org","threadId":"6595","inReplyTo":"81b0412b0702010003t7becddf3x8fe6b36b0d84599b@mail.gmail.com","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Mark Levedahl","fromEmail":"mdl123@verizon.net","sentAt":"2007-02-01T14:03:23Z","receivedAt":"2007-02-01T14:03:23Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"\"Alex Riesen\" <raa.lkml@gmail.com> wrote in message news:81b0412b0702010003t7becddf3x8fe6b36b0d84599b@mail.gmail.com...\n> On 2/1/07, Seth Falcon <sethfalcon@gmail.com> wrote:\n>>\n>> > I am not in X right now and won't be able to look at it myself\n>> > tonight.  Could folks on MacOS comment on Mark's patch?\n>>\n>> I gave it a quick spin on OS X.  gitk loads with a different geometry\n>> than it had before, but seems to work the same.  If this fixes things\n>> elsewhere, it seems fine here.\n>>\n>\n> FWIW, I confirm that. Much better. Mouse selection still does not\n> work in patch pane, but broken layout was the most annoying.\n> Thanks, Mark!\n\nYou are welcome.\nWe can deal with other annoyances later assuming the layout change gets accepted. (the patch is already big) \n"},{"id":"33237","messageId":"Pine.LNX.4.63.0702011503230.22628@wbgn013.biozentrum.uni-wuerzburg.de","threadId":"6595","inReplyTo":"epsrj3$gh8$1@sea.gmane.org","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2007-02-01T14:05:04Z","receivedAt":"2007-02-01T14:05:04Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Thu, 1 Feb 2007, Mark Levedahl wrote:\n\n> \"Johannes Schindelin\" <Johannes.Schindelin@gmx.de> wrote in message \n> news:Pine.LNX.4.63.0702011016430.22628@wbgn013.biozentrum.uni-wuerzburg.de...\n> >\n> > And then I find that you also fixed whitespace breakage, which does not\n> > belong in this patch.\n>\n> My editor simply will not write out trailing whitespace so I do not \n> notice when such breakage is fixed.\n\nFair enough.\n\n> In the attached, I split out the four whitespace fixes in a separate \n> patch.\n> \n> Mark \n> \n> \n> begin 666 0002-Make-gitk-work-reasonably-well-on-Cygwin.patch\n> [lots of uuencoded lines]\n\n;-)\n\nThanks a lot. It's way easier to review now, except for the lines \nbeginning with \"M\" ;-)\n\nCiao,\nDscho\n"},{"id":"33242","messageId":"epsviu$j4$1@sea.gmane.org","threadId":"6595","inReplyTo":"Pine.LNX.4.63.0702011503230.22628@wbgn013.biozentrum.uni-wuerzburg.de","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Mark Levedahl","fromEmail":"mdl123@verizon.net","sentAt":"2007-02-01T15:04:59Z","receivedAt":"2007-02-01T15:04:59Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"\"Johannes Schindelin\" <Johannes.Schindelin@gmx.de> wrote in message \nnews:Pine.LNX.4.63.0702011503230.22628@wbgn013.biozentrum.uni-wuerzburg.de...\n\n> Thanks a lot. It's way easier to review now, except for the lines\n> beginning with \"M\" ;-)\n>\n> Ciao,\n> Dscho\n>\n\nMaybe this works better?\n\n\n\n>From 3c04250616f0deed881ce1690e8c1950b1643b07 Mon Sep 17 00:00:00 2001\nFrom: Mark Levedahl <mdl123@verizon.net>\nDate: Thu, 1 Feb 2007 08:46:38 -0500\nSubject: [PATCH] Make gitk work reasonably well on Cygwin.\n\nThe gitk gui layout was completely broken on Cygwin. If gitk was started\nwithout previous geometry in ~/.gitk, the user could drag the window sashes\nto get a useable layout. However, if ~/.gitk existed, this was not possible\nat all.\n\nThe fix was to rewrite makewindow, changing the toplevel containers and\nthe particular geometry information saved between sessions. Numerous bugs\nin both the Cygwin and the Linux Tk versions make this a delicate\nbalancing act: the version here works in both but many subtle variants\nare competely broken in one or the other environment.\n\nThree user visible changes result:\n1 - The viewer is fully functional under Cygwin.\n2 - The search bar moves from the bottom to the top of the lower left\n    pane. This was necessary to get around a layout problem on Cygwin.\n3 - The window size and position is saved and restored between sessions.\n    Again, this is necessary to get around a layout problem on Cygwin.\n\nSigned-off-by: Mark Levedahl <mdl123@verizon.net>\n---\n gitk |  276 ++++++++++++++++++++++++++++++++++++------------------------------\n 1 files changed, 150 insertions(+), 126 deletions(-)\n\ndiff --git a/gitk b/gitk\nindex 650435e..8132812 100755\n--- a/gitk\n+++ b/gitk\n@@ -435,56 +435,59 @@ proc makewindow {} {\n     .bar.help configure -font $uifont\n     . configure -menu .bar\n \n-    if {![info exists geometry(canv1)]} {\n-\tset geometry(canv1) [expr {45 * $charspc}]\n-\tset geometry(canv2) [expr {30 * $charspc}]\n-\tset geometry(canv3) [expr {15 * $charspc}]\n-\tset geometry(canvh) [expr {25 * $linespc + 4}]\n-\tset geometry(ctextw) 80\n-\tset geometry(ctexth) 30\n-\tset geometry(cflistw) 30\n-    }\n+    # the gui has upper and lower half, parts of a paned window.\n     panedwindow .ctop -orient vertical\n-    if {[info exists geometry(width)]} {\n-\t.ctop conf -width $geometry(width) -height $geometry(height)\n-\tset texth [expr {$geometry(height) - $geometry(canvh) - 56}]\n-\tset geometry(ctexth) [expr {($texth - 8) /\n-\t\t\t\t    [font metrics $textfont -linespace]}]\n-    }\n-    frame .ctop.top\n-    frame .ctop.top.bar\n-    frame .ctop.top.lbar\n-    pack .ctop.top.lbar -side bottom -fill x\n-    pack .ctop.top.bar -side bottom -fill x\n-    set cscroll .ctop.top.csb\n-    scrollbar $cscroll -command {allcanvs yview} -highlightthickness 0\n-    pack $cscroll -side right -fill y\n-    panedwindow .ctop.top.clist -orient horizontal -sashpad 0 -handlesize 4\n-    pack .ctop.top.clist -side top -fill both -expand 1\n-    .ctop add .ctop.top\n-    set canv .ctop.top.clist.canv\n-    canvas $canv -height $geometry(canvh) -width $geometry(canv1) \\\n+\n+    # possibly use assumed geometry\n+    if {![info exists geometry(topheight)]} {\n+        set geometry(topheight) [expr {15 * $linespc}]\n+        set geometry(topwidth) [expr {80 * $charspc}]\n+        set geometry(botheight) [expr {15 * $linespc}]\n+        set geometry(botwidth) [expr {50 * $charspc}]\n+        set geometry(canv) [expr {40 * $charspc}]\n+        set geometry(canv2) [expr {20 * $charspc}]\n+        set geometry(canv3) [expr {20 * $charspc}]\n+    }\n+\n+    # the upper half will have a paned window, a scroll bar to the right, and some stuff below\n+    frame .tf -height $geometry(topheight) -width $geometry(topwidth)\n+    frame .tf.histframe\n+    panedwindow .tf.histframe.pwclist -orient horizontal -sashpad 0 -handlesize 4\n+\n+    # create three canvases\n+    set cscroll .tf.histframe.csb\n+    set canv .tf.histframe.pwclist.canv\n+    canvas $canv -width $geometry(canv) \\\n \t-background $bgcolor -bd 0 \\\n \t-yscrollincr $linespc -yscrollcommand \"scrollcanv $cscroll\"\n-    .ctop.top.clist add $canv\n-    set canv2 .ctop.top.clist.canv2\n-    canvas $canv2 -height $geometry(canvh) -width $geometry(canv2) \\\n+    .tf.histframe.pwclist add $canv\n+    set canv2 .tf.histframe.pwclist.canv2\n+    canvas $canv2 -width $geometry(canv2) \\\n \t-background $bgcolor -bd 0 -yscrollincr $linespc\n-    .ctop.top.clist add $canv2\n-    set canv3 .ctop.top.clist.canv3\n-    canvas $canv3 -height $geometry(canvh) -width $geometry(canv3) \\\n+    .tf.histframe.pwclist add $canv2\n+    set canv3 .tf.histframe.pwclist.canv3\n+    canvas $canv3 -width $geometry(canv3) \\\n \t-background $bgcolor -bd 0 -yscrollincr $linespc\n-    .ctop.top.clist add $canv3\n-    bind .ctop.top.clist <Configure> {resizeclistpanes %W %w}\n+    .tf.histframe.pwclist add $canv3\n+\n+    # a scroll bar to rule them\n+    scrollbar $cscroll -command {allcanvs yview} -highlightthickness 0\n+    pack $cscroll -side right -fill y\n+    bind .tf.histframe.pwclist <Configure> {resizeclistpanes %W %w}\n     lappend bglist $canv $canv2 $canv3\n+    pack .tf.histframe.pwclist -fill both -expand 1 -side left\n \n-    set sha1entry .ctop.top.bar.sha1\n+    # we have two button bars at bottom of top frame. Bar 1\n+    frame .tf.bar\n+    frame .tf.lbar -height 15\n+\n+    set sha1entry .tf.bar.sha1\n     set entries $sha1entry\n-    set sha1but .ctop.top.bar.sha1label\n+    set sha1but .tf.bar.sha1label\n     button $sha1but -text \"SHA1 ID: \" -state disabled -relief flat \\\n \t-command gotocommit -width 8 -font $uifont\n     $sha1but conf -disabledforeground [$sha1but cget -foreground]\n-    pack .ctop.top.bar.sha1label -side left\n+    pack .tf.bar.sha1label -side left\n     entry $sha1entry -width 40 -font $textfont -textvariable sha1string\n     trace add variable sha1string write sha1change\n     pack $sha1entry -side left -pady 2\n@@ -505,91 +508,105 @@ proc makewindow {} {\n \t0x00, 0x38, 0xff, 0x7f, 0xff, 0x7f, 0xff, 0x7f, 0x00, 0x38, 0x00, 0x1c,\n \t0x00, 0x0e, 0x00, 0x07, 0x80, 0x03, 0xc0, 0x01};\n     }\n-    button .ctop.top.bar.leftbut -image bm-left -command goback \\\n+    button .tf.bar.leftbut -image bm-left -command goback \\\n \t-state disabled -width 26\n-    pack .ctop.top.bar.leftbut -side left -fill y\n-    button .ctop.top.bar.rightbut -image bm-right -command goforw \\\n+    pack .tf.bar.leftbut -side left -fill y\n+    button .tf.bar.rightbut -image bm-right -command goforw \\\n \t-state disabled -width 26\n-    pack .ctop.top.bar.rightbut -side left -fill y\n+    pack .tf.bar.rightbut -side left -fill y\n \n-    button .ctop.top.bar.findbut -text \"Find\" -command dofind -font $uifont\n-    pack .ctop.top.bar.findbut -side left\n+    button .tf.bar.findbut -text \"Find\" -command dofind -font $uifont\n+    pack .tf.bar.findbut -side left\n     set findstring {}\n-    set fstring .ctop.top.bar.findstring\n+    set fstring .tf.bar.findstring\n     lappend entries $fstring\n     entry $fstring -width 30 -font $textfont -textvariable findstring\n     trace add variable findstring write find_change\n-    pack $fstring -side left -expand 1 -fill x\n+    pack $fstring -side left -expand 1 -fill x -in .tf.bar\n     set findtype Exact\n-    set findtypemenu [tk_optionMenu .ctop.top.bar.findtype \\\n-\t\t\t  findtype Exact IgnCase Regexp]\n+    set findtypemenu [tk_optionMenu .tf.bar.findtype \\\n+\t\t      findtype Exact IgnCase Regexp]\n     trace add variable findtype write find_change\n-    .ctop.top.bar.findtype configure -font $uifont\n-    .ctop.top.bar.findtype.menu configure -font $uifont\n+    .tf.bar.findtype configure -font $uifont\n+    .tf.bar.findtype.menu configure -font $uifont\n     set findloc \"All fields\"\n-    tk_optionMenu .ctop.top.bar.findloc findloc \"All fields\" Headline \\\n+    tk_optionMenu .tf.bar.findloc findloc \"All fields\" Headline \\\n \tComments Author Committer\n     trace add variable findloc write find_change\n-    .ctop.top.bar.findloc configure -font $uifont\n-    .ctop.top.bar.findloc.menu configure -font $uifont\n-    pack .ctop.top.bar.findloc -side right\n-    pack .ctop.top.bar.findtype -side right\n-\n-    label .ctop.top.lbar.flabel -text \"Highlight:  Commits \" \\\n-\t-font $uifont\n-    pack .ctop.top.lbar.flabel -side left -fill y\n+    .tf.bar.findloc configure -font $uifont\n+    .tf.bar.findloc.menu configure -font $uifont\n+    pack .tf.bar.findloc -side right\n+    pack .tf.bar.findtype -side right\n+\n+    # build up the bottom bar of upper window\n+    label .tf.lbar.flabel -text \"Highlight:  Commits \" \\\n+    -font $uifont\n+    pack .tf.lbar.flabel -side left -fill y\n     set gdttype \"touching paths:\"\n-    set gm [tk_optionMenu .ctop.top.lbar.gdttype gdttype \"touching paths:\" \\\n-\t\t\"adding/removing string:\"]\n+    set gm [tk_optionMenu .tf.lbar.gdttype gdttype \"touching paths:\" \\\n+\t\"adding/removing string:\"]\n     trace add variable gdttype write hfiles_change\n     $gm conf -font $uifont\n-    .ctop.top.lbar.gdttype conf -font $uifont\n-    pack .ctop.top.lbar.gdttype -side left -fill y\n-    entry .ctop.top.lbar.fent -width 25 -font $textfont \\\n+    .tf.lbar.gdttype conf -font $uifont\n+    pack .tf.lbar.gdttype -side left -fill y\n+    entry .tf.lbar.fent -width 25 -font $textfont \\\n \t-textvariable highlight_files\n     trace add variable highlight_files write hfiles_change\n-    lappend entries .ctop.top.lbar.fent\n-    pack .ctop.top.lbar.fent -side left -fill x -expand 1\n-    label .ctop.top.lbar.vlabel -text \" OR in view\" -font $uifont\n-    pack .ctop.top.lbar.vlabel -side left -fill y\n+    lappend entries .tf.lbar.fent\n+    pack .tf.lbar.fent -side left -fill x -expand 1\n+    label .tf.lbar.vlabel -text \" OR in view\" -font $uifont\n+    pack .tf.lbar.vlabel -side left -fill y\n     global viewhlmenu selectedhlview\n-    set viewhlmenu [tk_optionMenu .ctop.top.lbar.vhl selectedhlview None]\n+    set viewhlmenu [tk_optionMenu .tf.lbar.vhl selectedhlview None]\n     $viewhlmenu entryconf None -command delvhighlight\n     $viewhlmenu conf -font $uifont\n-    .ctop.top.lbar.vhl conf -font $uifont\n-    pack .ctop.top.lbar.vhl -side left -fill y\n-    label .ctop.top.lbar.rlabel -text \" OR \" -font $uifont\n-    pack .ctop.top.lbar.rlabel -side left -fill y\n+    .tf.lbar.vhl conf -font $uifont\n+    pack .tf.lbar.vhl -side left -fill y\n+    label .tf.lbar.rlabel -text \" OR \" -font $uifont\n+    pack .tf.lbar.rlabel -side left -fill y\n     global highlight_related\n-    set m [tk_optionMenu .ctop.top.lbar.relm highlight_related None \\\n-\t       \"Descendent\" \"Not descendent\" \"Ancestor\" \"Not ancestor\"]\n+    set m [tk_optionMenu .tf.lbar.relm highlight_related None \\\n+\t\"Descendent\" \"Not descendent\" \"Ancestor\" \"Not ancestor\"]\n     $m conf -font $uifont\n-    .ctop.top.lbar.relm conf -font $uifont\n+    .tf.lbar.relm conf -font $uifont\n     trace add variable highlight_related write vrel_change\n-    pack .ctop.top.lbar.relm -side left -fill y\n-\n-    panedwindow .ctop.cdet -orient horizontal\n-    .ctop add .ctop.cdet\n-    frame .ctop.cdet.left\n-    frame .ctop.cdet.left.bot\n-    pack .ctop.cdet.left.bot -side bottom -fill x\n-    button .ctop.cdet.left.bot.search -text \"Search\" -command dosearch \\\n+    pack .tf.lbar.relm -side left -fill y\n+\n+    # Finish putting the upper half of the viewer together\n+    pack .tf.lbar -in .tf -side bottom -fill x\n+    pack .tf.bar -in .tf -side bottom -fill x\n+    pack .tf.histframe -fill both -side top -expand 1\n+    .ctop add .tf\n+\n+    # now build up the bottom\n+    panedwindow .pwbottom -orient horizontal\n+\n+    # lower left, a text box over search bar, scroll bar to the right\n+    # if we know window height, then that will set the lower text height, otherwise\n+    # we set lower text height which will drive window height\n+    if {[info exists geometry(main)]} {\n+        frame .bleft -width $geometry(botwidth)\n+    } else {\n+        frame .bleft -width $geometry(botwidth) -height $geometry(botheight)\n+    }\n+    frame .bleft.top\n+\n+    button .bleft.top.search -text \"Search\" -command dosearch \\\n \t-font $uifont\n-    pack .ctop.cdet.left.bot.search -side left -padx 5\n-    set sstring .ctop.cdet.left.bot.sstring\n+    pack .bleft.top.search -side left -padx 5\n+    set sstring .bleft.top.sstring\n     entry $sstring -width 20 -font $textfont -textvariable searchstring\n     lappend entries $sstring\n     trace add variable searchstring write incrsearch\n     pack $sstring -side left -expand 1 -fill x\n-    set ctext .ctop.cdet.left.ctext\n+    set ctext .bleft.ctext\n     text $ctext -background $bgcolor -foreground $fgcolor \\\n \t-state disabled -font $textfont \\\n-\t-width $geometry(ctextw) -height $geometry(ctexth) \\\n \t-yscrollcommand scrolltext -wrap none\n-    scrollbar .ctop.cdet.left.sb -command \"$ctext yview\"\n-    pack .ctop.cdet.left.sb -side right -fill y\n+    scrollbar .bleft.sb -command \"$ctext yview\"\n+    pack .bleft.top -side top -fill x\n+    pack .bleft.sb -side right -fill y\n     pack $ctext -side left -fill both -expand 1\n-    .ctop.cdet add .ctop.cdet.left\n     lappend bglist $ctext\n     lappend fglist $ctext\n \n@@ -620,36 +637,45 @@ proc makewindow {} {\n     $ctext tag conf msep -font [concat $textfont bold]\n     $ctext tag conf found -back yellow\n \n-    frame .ctop.cdet.right\n-    frame .ctop.cdet.right.mode\n-    radiobutton .ctop.cdet.right.mode.patch -text \"Patch\" \\\n+    .pwbottom add .bleft\n+\n+    # lower right\n+    frame .bright\n+    frame .bright.mode\n+    radiobutton .bright.mode.patch -text \"Patch\" \\\n \t-command reselectline -variable cmitmode -value \"patch\"\n-    radiobutton .ctop.cdet.right.mode.tree -text \"Tree\" \\\n+    radiobutton .bright.mode.tree -text \"Tree\" \\\n \t-command reselectline -variable cmitmode -value \"tree\"\n-    grid .ctop.cdet.right.mode.patch .ctop.cdet.right.mode.tree -sticky ew\n-    pack .ctop.cdet.right.mode -side top -fill x\n-    set cflist .ctop.cdet.right.cfiles\n+    grid .bright.mode.patch .bright.mode.tree -sticky ew\n+    pack .bright.mode -side top -fill x\n+    set cflist .bright.cfiles\n     set indent [font measure $mainfont \"nn\"]\n-    text $cflist -width $geometry(cflistw) \\\n+    text $cflist \\\n \t-background $bgcolor -foreground $fgcolor \\\n \t-font $mainfont \\\n \t-tabs [list $indent [expr {2 * $indent}]] \\\n-\t-yscrollcommand \".ctop.cdet.right.sb set\" \\\n+\t-yscrollcommand \".bright.sb set\" \\\n \t-cursor [. cget -cursor] \\\n \t-spacing1 1 -spacing3 1\n     lappend bglist $cflist\n     lappend fglist $cflist\n-    scrollbar .ctop.cdet.right.sb -command \"$cflist yview\"\n-    pack .ctop.cdet.right.sb -side right -fill y\n+    scrollbar .bright.sb -command \"$cflist yview\"\n+    pack .bright.sb -side right -fill y\n     pack $cflist -side left -fill both -expand 1\n     $cflist tag configure highlight \\\n \t-background [$cflist cget -selectbackground]\n     $cflist tag configure bold -font [concat $mainfont bold]\n-    .ctop.cdet add .ctop.cdet.right\n-    bind .ctop.cdet <Configure> {resizecdetpanes %W %w}\n \n-    pack .ctop -side top -fill both -expand 1\n+    .pwbottom add .bright\n+    .ctop add .pwbottom\n \n+    # restore window position if known\n+    if {[info exists geometry(main)]} {\n+        wm geometry . \"$geometry(main)\"\n+    }\n+\n+    bind .pwbottom <Configure> {resizecdetpanes %W %w}\n+    pack .ctop -fill both -expand 1\n     bindall <1> {selcanvline %W %x %y}\n     #bindall <B1-Motion> {selcanvline %W %x %y}\n     bindall <ButtonRelease-4> \"allcanvs yview scroll -5 units\"\n@@ -802,18 +828,16 @@ proc savestuff {w} {\n \tputs $f [list set fgcolor $fgcolor]\n \tputs $f [list set colors $colors]\n \tputs $f [list set diffcolors $diffcolors]\n-\tputs $f \"set geometry(width) [winfo width .ctop]\"\n-\tputs $f \"set geometry(height) [winfo height .ctop]\"\n-\tputs $f \"set geometry(canv1) [expr {[winfo width $canv]-2}]\"\n-\tputs $f \"set geometry(canv2) [expr {[winfo width $canv2]-2}]\"\n-\tputs $f \"set geometry(canv3) [expr {[winfo width $canv3]-2}]\"\n-\tputs $f \"set geometry(canvh) [expr {[winfo height $canv]-2}]\"\n-\tset wid [expr {([winfo width $ctext] - 8) \\\n-\t\t\t   / [font measure $textfont \"0\"]}]\n-\tputs $f \"set geometry(ctextw) $wid\"\n-\tset wid [expr {([winfo width $cflist] - 11) \\\n-\t\t\t   / [font measure [$cflist cget -font] \"0\"]}]\n-\tputs $f \"set geometry(cflistw) $wid\"\n+\n+        puts $f \"set geometry(main) [winfo geometry .]\"\n+\tputs $f \"set geometry(topwidth) [winfo width .tf]\"\n+\tputs $f \"set geometry(topheight) [winfo height .tf]\"\n+\tputs $f \"set geometry(canv) [expr {[winfo width $canv]-0}]\"\n+\tputs $f \"set geometry(canv2) [expr {[winfo width $canv2]-0}]\"\n+\tputs $f \"set geometry(canv3) [expr {[winfo width $canv3]-0}]\"\n+\tputs $f \"set geometry(botwidth) [winfo width .bleft]\"\n+\tputs $f \"set geometry(botheight) [winfo height .bleft]\"\n+\n \tputs -nonewline $f \"set permviews {\"\n \tfor {set v 0} {$v < $nextviewnum} {incr v} {\n \t    if {$viewperm($v)} {\n@@ -4043,11 +4067,11 @@ proc addtohistory {cmd} {\n     }\n     incr historyindex\n     if {$historyindex > 1} {\n-\t.ctop.top.bar.leftbut conf -state normal\n+\t.tf.bar.leftbut conf -state normal\n     } else {\n-\t.ctop.top.bar.leftbut conf -state disabled\n+\t.tf.bar.leftbut conf -state disabled\n     }\n-    .ctop.top.bar.rightbut conf -state disabled\n+    .tf.bar.rightbut conf -state disabled\n }\n \n proc godo {elt} {\n@@ -4067,10 +4091,10 @@ proc goback {} {\n     if {$historyindex > 1} {\n \tincr historyindex -1\n \tgodo [lindex $history [expr {$historyindex - 1}]]\n-\t.ctop.top.bar.rightbut conf -state normal\n+\t.tf.bar.rightbut conf -state normal\n     }\n     if {$historyindex <= 1} {\n-\t.ctop.top.bar.leftbut conf -state disabled\n+\t.tf.bar.leftbut conf -state disabled\n     }\n }\n \n@@ -4081,10 +4105,10 @@ proc goforw {} {\n \tset cmd [lindex $history $historyindex]\n \tincr historyindex\n \tgodo $cmd\n-\t.ctop.top.bar.leftbut conf -state normal\n+\t.tf.bar.leftbut conf -state normal\n     }\n     if {$historyindex >= [llength $history]} {\n-\t.ctop.top.bar.rightbut conf -state disabled\n+\t.tf.bar.rightbut conf -state disabled\n     }\n }\n \n@@ -4591,7 +4615,7 @@ proc searchmarkvisible {doall} {\n proc scrolltext {f0 f1} {\n     global searchstring\n \n-    .ctop.cdet.left.sb set $f0 $f1\n+    .bleft.sb set $f0 $f1\n     if {$searchstring ne {}} {\n \tsearchmarkvisible 0\n     }\n-- \n1.5.0.rc2.76.g4fc0-dirty\n\n\n\n>From 3fc0e83b18d528ac5eceb5cc5b5404fa47fa69a5 Mon Sep 17 00:00:00 2001\nFrom: Mark Levedahl <mdl123@verizon.net>\nDate: Thu, 1 Feb 2007 08:44:46 -0500\nSubject: [PATCH] gitk - remove trailing whitespace from a few lines.\n\nSigned-off-by: Mark Levedahl <mdl123@verizon.net>\n---\n gitk |    8 ++++----\n 1 files changed, 4 insertions(+), 4 deletions(-)\n\ndiff --git a/gitk b/gitk\nindex 31d0aad..650435e 100755\n--- a/gitk\n+++ b/gitk\n@@ -427,7 +427,7 @@ proc makewindow {} {\n     .bar.view add separator\n     .bar.view add radiobutton -label \"All files\" -command {showview 0} \\\n \t-variable selectedview -value 0\n-    \n+\n     menu .bar.help\n     .bar add cascade -label \"Help\" -menu .bar.help\n     .bar.help add command -label \"About gitk\" -command about\n@@ -1402,7 +1402,7 @@ proc newview {ishighlight} {\n     set newviewname($nextviewnum) \"View $nextviewnum\"\n     set newviewperm($nextviewnum) 0\n     set newviewargs($nextviewnum) [shellarglist $revtreeargs]\n-    vieweditor $top $nextviewnum \"Gitk view definition\" \n+    vieweditor $top $nextviewnum \"Gitk view definition\"\n }\n \n proc editview {} {\n@@ -3897,7 +3897,7 @@ proc selectline {l isnew} {\n \t}\n \t$ctext insert end \"\\n\"\n     }\n- \n+\n     set headers {}\n     set olds [lindex $parentlist $l]\n     if {[llength $olds] > 1} {\n@@ -4006,7 +4006,7 @@ proc selnextpage {dir} {\n         set l [expr $numcommits - 1]\n     }\n     unmarkmatches\n-    selectline $l 1    \n+    selectline $l 1\n }\n \n proc unselectline {} {\n-- \n1.5.0.rc2.76.g4fc0-dirty\n\n"},{"id":"33244","messageId":"46d6db660702010728x68457809o37967f322d49933b@mail.gmail.com","threadId":"6595","inReplyTo":"epsviu$j4$1@sea.gmane.org","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Christian MICHON","fromEmail":"christian.michon@gmail.com","sentAt":"2007-02-01T15:28:09Z","receivedAt":"2007-02-01T15:28:09Z","isPatch":true,"sender":{"key":"christian.michon@gmail.com","avatar":"https://gravatar.com/avatar/8a7c327b21187fbcab5c27640a49450eec72e0355dc292501197f27a5a744ec4?d=mp&s=160"},"body":"On 2/1/07, Mark Levedahl <mdl123@verizon.net> wrote:\n> Maybe this works better?\n>\n\nyes. thanks: it helps on msys/mingw.\n\n-- \nChristian\n"},{"id":"33245","messageId":"45C209AA.25141180@eudaptics.com","threadId":"6595","inReplyTo":"epsviu$j4$1@sea.gmane.org","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Johannes Sixt","fromEmail":"j.sixt@eudaptics.com","sentAt":"2007-02-01T15:39:22Z","receivedAt":"2007-02-01T15:39:22Z","isPatch":true,"sender":{"key":"j6t@kdbg.org","avatar":"https://avatars.githubusercontent.com/u/14810926?v=4"},"body":"Mark Levedahl wrote:\n> \n> \"Johannes Schindelin\" <Johannes.Schindelin@gmx.de> wrote in message\n> news:Pine.LNX.4.63.0702011503230.22628@wbgn013.biozentrum.uni-wuerzburg.de...\n> \n> > Thanks a lot. It's way easier to review now, except for the lines\n> > beginning with \"M\" ;-)\n> >\n> > Ciao,\n> > Dscho\n> >\n> \n> Maybe this works better?\n\nIsn't this the same patch that Mike Nefari posted yesterday?\n\n-- Hannes\n"},{"id":"33246","messageId":"Pine.LNX.4.63.0702011659210.22628@wbgn013.biozentrum.uni-wuerzburg.de","threadId":"6595","inReplyTo":"45C209AA.25141180@eudaptics.com","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2007-02-01T16:00:49Z","receivedAt":"2007-02-01T16:00:49Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Thu, 1 Feb 2007, Johannes Sixt wrote:\n\n> Isn't this the same patch that Mike Nefari posted yesterday?\n\nJudging by the email address, Mike Nefari and Mark Levedahl are one and \nthe same.\n\nBTW with the short patch _I_ sent, MinGW gitk works quite well, too. But \nthen, I am not really interested in discussion about gitk, I already \nwasted to many cycles arguing with Paulus that he should accept my patch.\n\nCiao,\nDscho\n"},{"id":"33261","messageId":"ept8a1$43s$1@sea.gmane.org","threadId":"6595","inReplyTo":"Pine.LNX.4.63.0702011659210.22628@wbgn013.biozentrum.uni-wuerzburg.de","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Mark Levedahl","fromEmail":"mdl123@verizon.net","sentAt":"2007-02-01T17:33:51Z","receivedAt":"2007-02-01T17:33:51Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"\"Johannes Schindelin\" <Johannes.Schindelin@gmx.de> wrote in message \nnews:Pine.LNX.4.63.0702011659210.22628@wbgn013.biozentrum.uni-wuerzburg.de...\n> Hi,\n>\n> On Thu, 1 Feb 2007, Johannes Sixt wrote:\n>\n>> Isn't this the same patch that Mike Nefari posted yesterday?\n>\n> Judging by the email address, Mike Nefari and Mark Levedahl are one and\n> the same.\n\nI have no idea how the name \"Mike Nefari\" got on my hotmail account, but this patch is from me. I apologize for all of the email \nsystem related confusion.\n\nMark Levedahl \n"},{"id":"33273","messageId":"20070201192432.GD18608@spearce.org","threadId":"6595","inReplyTo":"81b0412b0702010003t7becddf3x8fe6b36b0d84599b@mail.gmail.com","subject":"Re: [PATCH] Make gitk work reasonably well on Cygwin.","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2007-02-01T19:24:32Z","receivedAt":"2007-02-01T19:24:32Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Alex Riesen <raa.lkml@gmail.com> wrote:\n> On 2/1/07, Seth Falcon <sethfalcon@gmail.com> wrote:\n> >\n> >> I am not in X right now and won't be able to look at it myself\n> >> tonight.  Could folks on MacOS comment on Mark's patch?\n> >\n> >I gave it a quick spin on OS X.  gitk loads with a different geometry\n> >than it had before, but seems to work the same.  If this fixes things\n> >elsewhere, it seems fine here.\n> >\n> \n> FWIW, I confirm that. Much better. Mouse selection still does not\n> work in patch pane, but broken layout was the most annoying.\n\nThe trick to getting mouse selection to work on Mac OS X on a\ndisabled text field (which is what that patch pane is):\n\n\tbind $damn_text_widget <Button-1> [list focus $damn_text_widget]\n\nApparently the disabled text widgets on Mac OS X don't receive\nfocus unless its forced by the application.  :-(\n\nThis trick doesn't harm a Tk application running on Windows, its\nsafe to just always setup the binding.  I'm using it in git-gui\nfor the diff pane.\n\n-- \nShawn.\n"}]}