{"thread":{"id":"18909","subject":"[PATCH] gitk: use themed tk widgets","startedAt":"2009-04-17T00:24:35Z","lastAt":"2009-04-30T23:47:52Z","messageCount":6,"participants":["Pat Thoyts","Johannes Schindelin","Paul Mackerras"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"111469","messageId":"873ac8m8jg.fsf@users.sourceforge.net","threadId":"18909","inReplyTo":null,"subject":"[PATCH] gitk: use themed tk widgets","fromName":"Pat Thoyts","fromEmail":"patthoyts@users.sourceforge.net","sentAt":"2009-04-17T00:24:35Z","receivedAt":"2009-04-17T00:24:35Z","isPatch":true,"sender":{"key":"patthoyts@users.sourceforge.net","avatar":"https://avatars.githubusercontent.com/u/30739?v=4"},"body":"\n  With Tk 8.5+ use the themed widgets to improve the appearence\n  on Windows and MacOSX. On X11 less difference is apparent but\n  users can select alternate themes by setting *TkTheme in the\n  resource database (eg: *TkTheme: clam)\n\n  With Tk 8.6 there is a built-in font selection dialog and this\n  patch will make use of that when available as on Windows and\n  MacOSX it calls the native font selection dialog.\n\nSigned-off-by: Pat Thoyts <patthoyts@users.sourceforge.net>\n---\n gitk |  590 ++++++++++++++++++++++++++++++++++++++++--------------------------\n 1 files changed, 356 insertions(+), 234 deletions(-)\n\ndiff --git a/gitk b/gitk\nindex a346bd5..053b1a0 100755\n--- a/gitk\n+++ b/gitk\n@@ -7,6 +7,8 @@ exec wish \"$0\" -- \"$@\"\n # and distributed under the terms of the GNU General Public Licence,\n # either version 2, or (at your option) any later version.\n \n+package require Tk\n+\n proc gitdir {} {\n     global env\n     if {[info exists env(GIT_DIR)]} {\n@@ -1767,6 +1769,15 @@ proc removehead {id name} {\n     unset headids($name)\n }\n \n+proc ttk_toplevel {w args} {\n+    global use_ttk\n+    eval [linsert $args 0 ::toplevel $w]\n+    if {$use_ttk} {\n+        place [ttk::frame $w._toplevel_background] -x 0 -y 0 -relwidth 1 -relheight 1\n+    }\n+    return $w\n+}\n+\n proc make_transient {window origin} {\n     global have_tk85\n \n@@ -1786,9 +1797,11 @@ proc make_transient {window origin} {\n }\n \n proc show_error {w top msg} {\n+    global NS\n+    if {[wm state $top] eq \"withdrawn\"} { wm deiconify $top }\n     message $w.m -text $msg -justify center -aspect 400\n     pack $w.m -side top -fill x -padx 20 -pady 20\n-    button $w.ok -text [mc OK] -command \"destroy $top\"\n+    ${NS}::button $w.ok -default active -text [mc OK] -command \"destroy $top\"\n     pack $w.ok -side bottom -fill x\n     bind $top <Visibility> \"grab $top; focus $top\"\n     bind $top <Key-Return> \"destroy $top\"\n@@ -1798,45 +1811,56 @@ proc show_error {w top msg} {\n }\n \n proc error_popup {msg {owner .}} {\n-    set w .error\n-    toplevel $w\n-    make_transient $w $owner\n-    show_error $w $w $msg\n+    if {[tk windowingsystem] eq \"win32\"} {\n+        tk_messageBox -icon error -type ok -title [wm title .] \\\n+            -parent $owner -message $msg\n+    } else {\n+        set w .error\n+        ttk_toplevel $w\n+        make_transient $w $owner\n+        show_error $w $w $msg\n+    }\n }\n \n proc confirm_popup {msg {owner .}} {\n-    global confirm_ok\n+    global confirm_ok NS\n     set confirm_ok 0\n     set w .confirm\n-    toplevel $w\n+    ttk_toplevel $w\n     make_transient $w $owner\n     message $w.m -text $msg -justify center -aspect 400\n     pack $w.m -side top -fill x -padx 20 -pady 20\n-    button $w.ok -text [mc OK] -command \"set confirm_ok 1; destroy $w\"\n+    ${NS}::button $w.ok -text [mc OK] -command \"set confirm_ok 1; destroy $w\"\n     pack $w.ok -side left -fill x\n-    button $w.cancel -text [mc Cancel] -command \"destroy $w\"\n+    ${NS}::button $w.cancel -text [mc Cancel] -command \"destroy $w\"\n     pack $w.cancel -side right -fill x\n     bind $w <Visibility> \"grab $w; focus $w\"\n     bind $w <Key-Return> \"set confirm_ok 1; destroy $w\"\n     bind $w <Key-space>  \"set confirm_ok 1; destroy $w\"\n     bind $w <Key-Escape> \"destroy $w\"\n+    tk::PlaceWindow $w widget $owner\n     tkwait window $w\n     return $confirm_ok\n }\n \n proc setoptions {} {\n-    option add *Panedwindow.showHandle 1 startupFile\n-    option add *Panedwindow.sashRelief raised startupFile\n+    if {[tk windowingsystem] ne \"win32\"} {\n+        option add *Panedwindow.showHandle 1 startupFile\n+        option add *Panedwindow.sashRelief raised startupFile\n+        if {[tk windowingsystem] ne \"aqua\"} {\n+            option add *Menu.font uifont startupFile\n+        }\n+    } else {\n+        option add *Menu.TearOff 0 startupFile\n+    }\n     option add *Button.font uifont startupFile\n     option add *Checkbutton.font uifont startupFile\n     option add *Radiobutton.font uifont startupFile\n-    if {[tk windowingsystem] ne \"aqua\"} {\n-\toption add *Menu.font uifont startupFile\n-    }\n     option add *Menubutton.font uifont startupFile\n     option add *Label.font uifont startupFile\n     option add *Message.font uifont startupFile\n     option add *Entry.font uifont startupFile\n+    option add *Labelframe.font uifont startupFile\n }\n \n # Make a menu and submenus.\n@@ -1893,6 +1917,17 @@ proc mca {str} {\n     return [string map {&& & & {}} [mc $str]]\n }\n \n+proc makedroplist {w varname args} {\n+    global use_ttk\n+    if {$use_ttk} {\n+\tset gm [ttk::combobox $w -width 10 -state readonly\\\n+\t\t    -textvariable $varname -values $args]\n+    } else {\n+\tset gm [eval [linsert $args 0 tk_optionMenu $w $varname]]\n+    }\n+    return $gm\n+}\n+\n proc makewindow {} {\n     global canv canv2 canv3 linespc charspc ctext cflist cscroll\n     global tabstop\n@@ -1908,7 +1943,7 @@ proc makewindow {} {\n     global headctxmenu progresscanv progressitem progresscoords statusw\n     global fprogitem fprogcoord lastprogupdate progupdatepending\n     global rprogitem rprogcoord rownumsel numcommits\n-    global have_tk85\n+    global have_tk85 use_ttk NS\n \n     # The \"mc\" arguments here are purely so that xgettext\n     # sees the following string as needing to be translated\n@@ -1960,8 +1995,13 @@ proc makewindow {} {\n     makemenu .bar $bar\n     . configure -menu .bar\n \n+    if {$use_ttk} {\n+        # cover the non-themed toplevel with a themed frame.\n+        place [ttk::frame ._main_background] -x 0 -y 0 -relwidth 1 -relheight 1\n+    }\n+\n     # the gui has upper and lower half, parts of a paned window.\n-    panedwindow .ctop -orient vertical\n+    ${NS}::panedwindow .ctop -orient vertical\n \n     # possibly use assumed geometry\n     if {![info exists geometry(pwsash0)]} {\n@@ -1969,14 +2009,17 @@ proc makewindow {} {\n         set geometry(topwidth) [expr {80 * $charspc}]\n         set geometry(botheight) [expr {15 * $linespc}]\n         set geometry(botwidth) [expr {50 * $charspc}]\n-        set geometry(pwsash0) \"[expr {40 * $charspc}] 2\"\n-        set geometry(pwsash1) \"[expr {60 * $charspc}] 2\"\n+        set geometry(pwsash0) [list [expr {40 * $charspc}] 2]\n+        set geometry(pwsash1) [list [expr {60 * $charspc}] 2]\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+    ${NS}::frame .tf -height $geometry(topheight) -width $geometry(topwidth)\n+    ${NS}::frame .tf.histframe\n+    ${NS}::panedwindow .tf.histframe.pwclist -orient horizontal\n+    if {!$use_ttk} {\n+\t.tf.histframe.pwclist configure -sashpad 0 -handlesize 4\n+    }\n \n     # create three canvases\n     set cscroll .tf.histframe.csb\n@@ -1996,19 +2039,28 @@ proc makewindow {} {\n \t-selectbackground $selectbgcolor \\\n \t-background $bgcolor -bd 0 -yscrollincr $linespc\n     .tf.histframe.pwclist add $canv3\n-    eval .tf.histframe.pwclist sash place 0 $geometry(pwsash0)\n-    eval .tf.histframe.pwclist sash place 1 $geometry(pwsash1)\n+    if {$use_ttk} {\n+\tbind .tf.histframe.pwclist <Map> {\n+\t    bind %W <Map> {}\n+\t    .tf.histframe.pwclist sashpos 1 [lindex $::geometry(pwsash1) 0]\n+\t    .tf.histframe.pwclist sashpos 0 [lindex $::geometry(pwsash0) 0]\n+\t}\n+    } else {\n+\teval .tf.histframe.pwclist sash place 0 $geometry(pwsash0)\n+\teval .tf.histframe.pwclist sash place 1 $geometry(pwsash1)\n+    }\n \n     # a scroll bar to rule them\n-    scrollbar $cscroll -command {allcanvs yview} -highlightthickness 0\n+    ${NS}::scrollbar $cscroll -command {allcanvs yview}\n+    if {!$use_ttk} {$cscroll configure -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+    ${NS}::frame .tf.bar\n+    ${NS}::frame .tf.lbar -height 15\n \n     set sha1entry .tf.bar.sha1\n     set entries $sha1entry\n@@ -2017,7 +2069,7 @@ proc makewindow {} {\n \t-command gotocommit -width 8\n     $sha1but conf -disabledforeground [$sha1but cget -foreground]\n     pack .tf.bar.sha1label -side left\n-    entry $sha1entry -width 40 -font textfont -textvariable sha1string\n+    ${NS}::entry $sha1entry -width 40 -font textfont -textvariable sha1string\n     trace add variable sha1string write sha1change\n     pack $sha1entry -side left -pady 2\n \n@@ -2037,36 +2089,43 @@ 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 .tf.bar.leftbut -image bm-left -command goback \\\n+    ${NS}::button .tf.bar.leftbut -image bm-left -command goback \\\n \t-state disabled -width 26\n     pack .tf.bar.leftbut -side left -fill y\n-    button .tf.bar.rightbut -image bm-right -command goforw \\\n+    ${NS}::button .tf.bar.rightbut -image bm-right -command goforw \\\n \t-state disabled -width 26\n     pack .tf.bar.rightbut -side left -fill y\n \n-    label .tf.bar.rowlabel -text [mc \"Row\"]\n+    ${NS}::label .tf.bar.rowlabel -text [mc \"Row\"]\n     set rownumsel {}\n-    label .tf.bar.rownum -width 7 -font textfont -textvariable rownumsel \\\n+    ${NS}::label .tf.bar.rownum -width 7 -textvariable rownumsel \\\n \t-relief sunken -anchor e\n-    label .tf.bar.rowlabel2 -text \"/\"\n-    label .tf.bar.numcommits -width 7 -font textfont -textvariable numcommits \\\n+    ${NS}::label .tf.bar.rowlabel2 -text \"/\"\n+    ${NS}::label .tf.bar.numcommits -width 7 -textvariable numcommits \\\n \t-relief sunken -anchor e\n     pack .tf.bar.rowlabel .tf.bar.rownum .tf.bar.rowlabel2 .tf.bar.numcommits \\\n \t-side left\n+    if {!$use_ttk} {\n+        foreach w {rownum numcommits} {.tf.bar.$w configure -font textfont}\n+    }\n     global selectedline\n     trace add variable selectedline write selectedline_change\n \n     # Status label and progress bar\n     set statusw .tf.bar.status\n-    label $statusw -width 15 -relief sunken\n+    ${NS}::label $statusw -width 15 -relief sunken\n     pack $statusw -side left -padx 5\n-    set h [expr {[font metrics uifont -linespace] + 2}]\n-    set progresscanv .tf.bar.progress\n-    canvas $progresscanv -relief sunken -height $h -borderwidth 2\n-    set progressitem [$progresscanv create rect -1 0 0 $h -fill green]\n-    set fprogitem [$progresscanv create rect -1 0 0 $h -fill yellow]\n-    set rprogitem [$progresscanv create rect -1 0 0 $h -fill red]\n-    pack $progresscanv -side right -expand 1 -fill x\n+    if {$use_ttk} {\n+\tset progresscanv [ttk::progressbar .tf.bar.progress]\n+    } else {\n+\tset h [expr {[font metrics uifont -linespace] + 2}]\n+\tset progresscanv .tf.bar.progress\n+\tcanvas $progresscanv -relief sunken -height $h -borderwidth 2\n+\tset progressitem [$progresscanv create rect -1 0 0 $h -fill green]\n+\tset fprogitem [$progresscanv create rect -1 0 0 $h -fill yellow]\n+\tset rprogitem [$progresscanv create rect -1 0 0 $h -fill red]\n+    }\n+    pack $progresscanv -side right -expand 1 -fill x -padx {0 2}\n     set progresscoords {0 0}\n     set fprogcoord 0\n     set rprogcoord 0\n@@ -2075,14 +2134,14 @@ proc makewindow {} {\n     set progupdatepending 0\n \n     # build up the bottom bar of upper window\n-    label .tf.lbar.flabel -text \"[mc \"Find\"] \"\n-    button .tf.lbar.fnext -text [mc \"next\"] -command {dofind 1 1}\n-    button .tf.lbar.fprev -text [mc \"prev\"] -command {dofind -1 1}\n-    label .tf.lbar.flab2 -text \" [mc \"commit\"] \"\n+    ${NS}::label .tf.lbar.flabel -text \"[mc \"Find\"] \"\n+    ${NS}::button .tf.lbar.fnext -text [mc \"next\"] -command {dofind 1 1}\n+    ${NS}::button .tf.lbar.fprev -text [mc \"prev\"] -command {dofind -1 1}\n+    ${NS}::label .tf.lbar.flab2 -text \" [mc \"commit\"] \"\n     pack .tf.lbar.flabel .tf.lbar.fnext .tf.lbar.fprev .tf.lbar.flab2 \\\n \t-side left -fill y\n     set gdttype [mc \"containing:\"]\n-    set gm [tk_optionMenu .tf.lbar.gdttype gdttype \\\n+    set gm [makedroplist .tf.lbar.gdttype gdtype \\\n \t\t[mc \"containing:\"] \\\n \t\t[mc \"touching paths:\"] \\\n \t\t[mc \"adding/removing string:\"]]\n@@ -2092,14 +2151,14 @@ proc makewindow {} {\n     set findstring {}\n     set fstring .tf.lbar.findstring\n     lappend entries $fstring\n-    entry $fstring -width 30 -font textfont -textvariable findstring\n+    ${NS}::entry $fstring -width 30 -font textfont -textvariable findstring\n     trace add variable findstring write find_change\n     set findtype [mc \"Exact\"]\n-    set findtypemenu [tk_optionMenu .tf.lbar.findtype \\\n-\t\t      findtype [mc \"Exact\"] [mc \"IgnCase\"] [mc \"Regexp\"]]\n+    set findtypemenu [makedroplist .tf.lbar.findtype \\\n+\t\t\t  findtype [mc \"Exact\"] [mc \"IgnCase\"] [mc \"Regexp\"]]\n     trace add variable findtype write findcom_change\n     set findloc [mc \"All fields\"]\n-    tk_optionMenu .tf.lbar.findloc findloc [mc \"All fields\"] [mc \"Headline\"] \\\n+    makedroplist .tf.lbar.findloc findloc [mc \"All fields\"] [mc \"Headline\"] \\\n \t[mc \"Comments\"] [mc \"Author\"] [mc \"Committer\"]\n     trace add variable findloc write find_change\n     pack .tf.lbar.findloc -side right\n@@ -2111,38 +2170,41 @@ proc makewindow {} {\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-    .ctop paneconfigure .tf -height $geometry(topheight)\n-    .ctop paneconfigure .tf -width $geometry(topwidth)\n+    if {!$use_ttk} {\n+\t.ctop paneconfigure .tf -height $geometry(topheight)\n+\t.ctop paneconfigure .tf -width $geometry(topwidth)\n+    }\n \n     # now build up the bottom\n-    panedwindow .pwbottom -orient horizontal\n+    ${NS}::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+\t${NS}::frame .bleft -width $geometry(botwidth)\n     } else {\n-        frame .bleft -width $geometry(botwidth) -height $geometry(botheight)\n+\t${NS}::frame .bleft -width $geometry(botwidth) -height $geometry(botheight)\n     }\n-    frame .bleft.top\n-    frame .bleft.mid\n-    frame .bleft.bottom\n+    ${NS}::frame .bleft.top\n+    ${NS}::frame .bleft.mid\n+    ${NS}::frame .bleft.bottom\n \n-    button .bleft.top.search -text [mc \"Search\"] -command dosearch\n+    ${NS}::button .bleft.top.search -text [mc \"Search\"] -command dosearch\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+    set searchstring \"\"\n+    ${NS}::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-    radiobutton .bleft.mid.diff -text [mc \"Diff\"] \\\n+    ${NS}::radiobutton .bleft.mid.diff -text [mc \"Diff\"] \\\n \t-command changediffdisp -variable diffelide -value {0 0}\n-    radiobutton .bleft.mid.old -text [mc \"Old version\"] \\\n+    ${NS}::radiobutton .bleft.mid.old -text [mc \"Old version\"] \\\n \t-command changediffdisp -variable diffelide -value {0 1}\n-    radiobutton .bleft.mid.new -text [mc \"New version\"] \\\n+    ${NS}::radiobutton .bleft.mid.new -text [mc \"New version\"] \\\n \t-command changediffdisp -variable diffelide -value {1 0}\n-    label .bleft.mid.labeldiffcontext -text \"      [mc \"Lines of context\"]: \"\n+    ${NS}::label .bleft.mid.labeldiffcontext -text \"      [mc \"Lines of context\"]: \"\n     pack .bleft.mid.diff .bleft.mid.old .bleft.mid.new -side left\n     spinbox .bleft.mid.diffcontext -width 5 -font textfont \\\n \t-from 1 -increment 1 -to 10000000 \\\n@@ -2152,7 +2214,7 @@ proc makewindow {} {\n     trace add variable diffcontextstring write diffcontextchange\n     lappend entries .bleft.mid.diffcontext\n     pack .bleft.mid.labeldiffcontext .bleft.mid.diffcontext -side left\n-    checkbutton .bleft.mid.ignspace -text [mc \"Ignore space change\"] \\\n+    ${NS}::checkbutton .bleft.mid.ignspace -text [mc \"Ignore space change\"] \\\n \t-command changeignorespace -variable ignorespace\n     pack .bleft.mid.ignspace -side left -padx 5\n     set ctext .bleft.bottom.ctext\n@@ -2163,9 +2225,8 @@ proc makewindow {} {\n     if {$have_tk85} {\n \t$ctext conf -tabstyle wordprocessor\n     }\n-    scrollbar .bleft.bottom.sb -command \"$ctext yview\"\n-    scrollbar .bleft.bottom.sbhorizontal -command \"$ctext xview\" -orient h \\\n-\t-width 10\n+    ${NS}::scrollbar .bleft.bottom.sb -command \"$ctext yview\"\n+    ${NS}::scrollbar .bleft.bottom.sbhorizontal -command \"$ctext xview\" -orient h\n     pack .bleft.top -side top -fill x\n     pack .bleft.mid -side top -fill x\n     grid $ctext .bleft.bottom.sb -sticky nsew\n@@ -2205,14 +2266,16 @@ proc makewindow {} {\n     $ctext tag conf found -back yellow\n \n     .pwbottom add .bleft\n-    .pwbottom paneconfigure .bleft -width $geometry(botwidth)\n+    if {!$use_ttk} {\n+\t.pwbottom paneconfigure .bleft -width $geometry(botwidth)\n+    }\n \n     # lower right\n-    frame .bright\n-    frame .bright.mode\n-    radiobutton .bright.mode.patch -text [mc \"Patch\"] \\\n+    ${NS}::frame .bright\n+    ${NS}::frame .bright.mode\n+    ${NS}::radiobutton .bright.mode.patch -text [mc \"Patch\"] \\\n \t-command reselectline -variable cmitmode -value \"patch\"\n-    radiobutton .bright.mode.tree -text [mc \"Tree\"] \\\n+    ${NS}::radiobutton .bright.mode.tree -text [mc \"Tree\"] \\\n \t-command reselectline -variable cmitmode -value \"tree\"\n     grid .bright.mode.patch .bright.mode.tree -sticky ew\n     pack .bright.mode -side top -fill x\n@@ -2228,7 +2291,7 @@ proc makewindow {} {\n \t-spacing1 1 -spacing3 1\n     lappend bglist $cflist\n     lappend fglist $cflist\n-    scrollbar .bright.sb -command \"$cflist yview\"\n+    ${NS}::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@@ -2477,7 +2540,12 @@ proc click {w} {\n proc adjustprogress {} {\n     global progresscanv progressitem progresscoords\n     global fprogitem fprogcoord lastprogupdate progupdatepending\n-    global rprogitem rprogcoord\n+    global rprogitem rprogcoord use_ttk\n+    \n+    if {$use_ttk} {\n+\t$progresscanv configure -value [expr {int($fprogcoord * 100)}]\n+\treturn\n+    }\n \n     set w [expr {[winfo width $progresscanv] - 4}]\n     set x0 [expr {$w * [lindex $progresscoords 0]}]\n@@ -2513,7 +2581,7 @@ proc savestuff {w} {\n     global viewname viewfiles viewargs viewargscmd viewperm nextviewnum\n     global cmitmode wrapcomment datetimeformat limitdiffs\n     global colors bgcolor fgcolor diffcolors diffcontext selectbgcolor\n-    global autoselect extdifftool perfile_attrs markbgcolor\n+    global autoselect extdifftool perfile_attrs markbgcolor use_ttk\n \n     if {$stuffsaved} return\n     if {![winfo viewable .]} return\n@@ -2547,8 +2615,13 @@ proc savestuff {w} {\n \tputs $f \"set geometry(state) [wm state .]\"\n \tputs $f \"set geometry(topwidth) [winfo width .tf]\"\n \tputs $f \"set geometry(topheight) [winfo height .tf]\"\n-        puts $f \"set geometry(pwsash0) \\\"[.tf.histframe.pwclist sash coord 0]\\\"\"\n-        puts $f \"set geometry(pwsash1) \\\"[.tf.histframe.pwclist sash coord 1]\\\"\"\n+\tif {$use_ttk} {\n+\t    puts $f \"set geometry(pwsash0) \\\"[.tf.histframe.pwclist sashpos 0] 1\\\"\"\n+\t    puts $f \"set geometry(pwsash1) \\\"[.tf.histframe.pwclist sashpos 1] 1\\\"\"\n+\t} else {\n+\t    puts $f \"set geometry(pwsash0) \\\"[.tf.histframe.pwclist sash coord 0]\\\"\"\n+\t    puts $f \"set geometry(pwsash1) \\\"[.tf.histframe.pwclist sash coord 1]\\\"\"\n+\t}\n \tputs $f \"set geometry(botwidth) [winfo width .bleft]\"\n \tputs $f \"set geometry(botheight) [winfo height .bleft]\"\n \n@@ -2566,10 +2639,15 @@ proc savestuff {w} {\n }\n \n proc resizeclistpanes {win w} {\n-    global oldwidth\n+    global oldwidth use_ttk\n     if {[info exists oldwidth($win)]} {\n-\tset s0 [$win sash coord 0]\n-\tset s1 [$win sash coord 1]\n+\tif {$use_ttk} {\n+\t    set s0 [$win sashpos 0]\n+\t    set s1 [$win sashpos 1]\n+\t} else {\n+\t    set s0 [$win sash coord 0]\n+\t    set s1 [$win sash coord 1]\n+\t}\n \tif {$w < 60} {\n \t    set sash0 [expr {int($w/2 - 2)}]\n \t    set sash1 [expr {int($w*5/6 - 2)}]\n@@ -2590,16 +2668,25 @@ proc resizeclistpanes {win w} {\n \t\t}\n \t    }\n \t}\n-\t$win sash place 0 $sash0 [lindex $s0 1]\n-\t$win sash place 1 $sash1 [lindex $s1 1]\n+\tif {$use_ttk} {\n+\t    $win sashpos 0 $sash0\n+\t    $win sashpos 1 $sash1\n+\t} else {\n+\t    $win sash place 0 $sash0 [lindex $s0 1]\n+\t    $win sash place 1 $sash1 [lindex $s1 1]\n+\t}\n     }\n     set oldwidth($win) $w\n }\n \n proc resizecdetpanes {win w} {\n-    global oldwidth\n+    global oldwidth use_ttk\n     if {[info exists oldwidth($win)]} {\n-\tset s0 [$win sash coord 0]\n+\tif {$use_ttk} {\n+\t    set s0 [$win sashpos 0]\n+\t} else {\n+\t    set s0 [$win sash coord 0]\n+\t}\n \tif {$w < 60} {\n \t    set sash0 [expr {int($w*3/4 - 2)}]\n \t} else {\n@@ -2612,7 +2699,11 @@ proc resizecdetpanes {win w} {\n \t\tset sash0 [expr {$w - 15}]\n \t    }\n \t}\n-\t$win sash place 0 $sash0 [lindex $s0 1]\n+\tif {$use_ttk} {\n+\t    $win sashpos 0 $sash0\n+\t} else {\n+\t    $win sash place 0 $sash0 [lindex $s0 1]\n+\t}\n     }\n     set oldwidth($win) $w\n }\n@@ -2632,31 +2723,33 @@ proc bindall {event action} {\n }\n \n proc about {} {\n-    global uifont\n+    global uifont NS\n     set w .about\n     if {[winfo exists $w]} {\n \traise $w\n \treturn\n     }\n-    toplevel $w\n+    ttk_toplevel $w\n     wm title $w [mc \"About gitk\"]\n     make_transient $w .\n     message $w.m -text [mc \"\n Gitk - a commit viewer for git\n \n-Copyright Â© 2005-2008 Paul Mackerras\n+Copyright \\u00a9 2005-2009 Paul Mackerras\n \n Use and redistribute under the terms of the GNU General Public License\"] \\\n \t    -justify center -aspect 400 -border 2 -bg white -relief groove\n     pack $w.m -side top -fill x -padx 2 -pady 2\n-    button $w.ok -text [mc \"Close\"] -command \"destroy $w\" -default active\n+    ${NS}::button $w.ok -text [mc \"Close\"] -command \"destroy $w\" -default active\n     pack $w.ok -side bottom\n     bind $w <Visibility> \"focus $w.ok\"\n     bind $w <Key-Escape> \"destroy $w\"\n     bind $w <Key-Return> \"destroy $w\"\n+    tk::PlaceWindow $w widget .\n }\n \n proc keys {} {\n+    global NS\n     set w .keys\n     if {[winfo exists $w]} {\n \traise $w\n@@ -2667,7 +2760,7 @@ proc keys {} {\n     } else {\n \tset M1T Ctrl\n     }\n-    toplevel $w\n+    ttk_toplevel $w\n     wm title $w [mc \"Gitk key bindings\"]\n     make_transient $w .\n     message $w.m -text \"\n@@ -2711,7 +2804,7 @@ proc keys {} {\n \" \\\n \t    -justify left -bg white -border 2 -relief groove\n     pack $w.m -side top -fill both -padx 2 -pady 2\n-    button $w.ok -text [mc \"Close\"] -command \"destroy $w\" -default active\n+    ${NS}::button $w.ok -text [mc \"Close\"] -command \"destroy $w\" -default active\n     bind $w <Key-Escape> [list destroy $w]\n     pack $w.ok -side bottom\n     bind $w <Visibility> \"focus $w.ok\"\n@@ -3774,16 +3867,16 @@ proc editview {} {\n \n proc vieweditor {top n title} {\n     global newviewname newviewopts viewfiles bgcolor\n-    global known_view_options\n+    global known_view_options NS\n \n-    toplevel $top\n+    ttk_toplevel $top\n     wm title $top $title\n     make_transient $top .\n \n     # View name\n-    frame $top.nfr\n-    label $top.nl -text [mc \"Name\"]\n-    entry $top.name -width 20 -textvariable newviewname($n)\n+    ${NS}::frame $top.nfr\n+    ${NS}::label $top.nl -text [mc \"Name\"]\n+    ${NS}::entry $top.name -width 20 -textvariable newviewname($n)\n     pack $top.nfr -in $top -fill x -pady 5 -padx 3\n     pack $top.nl -in $top.nfr -side left -padx {0 30}\n     pack $top.name -in $top.nfr -side left\n@@ -3802,7 +3895,7 @@ proc vieweditor {top n title} {\n \tif {$flags eq \"+\" || $flags eq \"*\"} {\n \t    set cframe $top.fr$cnt\n \t    incr cnt\n-\t    frame $cframe\n+\t    ${NS}::frame $cframe\n \t    pack $cframe -in $top -fill x -pady 3 -padx 3\n \t    set cexpand [expr {$flags eq \"*\"}]\n \t} else {\n@@ -3810,18 +3903,18 @@ proc vieweditor {top n title} {\n \t}\n \n \tif {$type eq \"b\"} {\n-\t    checkbutton $cframe.c_$id -text $title -variable newviewopts($n,$id)\n+\t    ${NS}::checkbutton $cframe.c_$id -text $title -variable newviewopts($n,$id)\n \t    pack $cframe.c_$id -in $cframe -side left \\\n \t\t-padx [list $lxpad 0] -expand $cexpand -anchor w\n \t} elseif {[regexp {^t(\\d+)$} $type type sz]} {\n-\t    message $cframe.l_$id -aspect 1500 -text $title\n-\t    entry $cframe.e_$id -width $sz -background $bgcolor \\\n+\t    ${NS}::label $cframe.l_$id -text $title\n+\t    ${NS}::entry $cframe.e_$id -width $sz -background $bgcolor \\\n \t\t-textvariable newviewopts($n,$id)\n \t    pack $cframe.l_$id -in $cframe -side left -padx [list $lxpad 0]\n \t    pack $cframe.e_$id -in $cframe -side left -expand 1 -fill x\n \t} elseif {[regexp {^t(\\d+)=$} $type type sz]} {\n-\t    message $cframe.l_$id -aspect 1500 -text $title\n-\t    entry $cframe.e_$id -width $sz -background $bgcolor \\\n+\t    ${NS}::label $cframe.l_$id -text $title\n+\t    ${NS}::entry $cframe.e_$id -width $sz -background $bgcolor \\\n \t\t-textvariable newviewopts($n,$id)\n \t    pack $cframe.l_$id -in $cframe -side top -pady [list 3 0] -anchor w\n \t    pack $cframe.e_$id -in $cframe -side top -fill x\n@@ -3829,7 +3922,7 @@ proc vieweditor {top n title} {\n     }\n \n     # Path list\n-    message $top.l -aspect 1500 \\\n+    ${NS}::label $top.l \\\n \t-text [mc \"Enter files and directories to include, one per line:\"]\n     pack $top.l -in $top -side top -pady [list 7 0] -anchor w -padx 3\n     text $top.t -width 40 -height 5 -background $bgcolor -font uifont\n@@ -3842,10 +3935,10 @@ proc vieweditor {top n title} {\n \t$top.t mark set insert 0.0\n     }\n     pack $top.t -in $top -side top -pady [list 0 5] -fill both -expand 1 -padx 3\n-    frame $top.buts\n-    button $top.buts.ok -text [mc \"OK\"] -command [list newviewok $top $n]\n-    button $top.buts.apply -text [mc \"Apply (F5)\"] -command [list newviewok $top $n 1]\n-    button $top.buts.can -text [mc \"Cancel\"] -command [list destroy $top]\n+    ${NS}::frame $top.buts\n+    ${NS}::button $top.buts.ok -text [mc \"OK\"] -command [list newviewok $top $n]\n+    ${NS}::button $top.buts.apply -text [mc \"Apply (F5)\"] -command [list newviewok $top $n 1]\n+    ${NS}::button $top.buts.can -text [mc \"Cancel\"] -command [list destroy $top]\n     bind $top <Control-Return> [list newviewok $top $n]\n     bind $top <F5> [list newviewok $top $n 1]\n     bind $top <Escape> [list destroy $top]\n@@ -6688,8 +6781,7 @@ proc selectline {l isnew {desired_loc {}}} {\n     $sha1entry delete 0 end\n     $sha1entry insert 0 $id\n     if {$autoselect} {\n-\t$sha1entry selection from 0\n-\t$sha1entry selection to end\n+\t$sha1entry selection range 0 end\n     }\n     rhighlight_sel $id\n \n@@ -8067,7 +8159,7 @@ proc doseldiff {oldid newid} {\n }\n \n proc mkpatch {} {\n-    global rowmenuid currentid commitinfo patchtop patchnum\n+    global rowmenuid currentid commitinfo patchtop patchnum NS\n \n     if {![info exists currentid]} return\n     set oldid $currentid\n@@ -8077,38 +8169,38 @@ proc mkpatch {} {\n     set top .patch\n     set patchtop $top\n     catch {destroy $top}\n-    toplevel $top\n+    ttk_toplevel $top\n     make_transient $top .\n-    label $top.title -text [mc \"Generate patch\"]\n+    ${NS}::label $top.title -text [mc \"Generate patch\"]\n     grid $top.title - -pady 10\n-    label $top.from -text [mc \"From:\"]\n-    entry $top.fromsha1 -width 40 -relief flat\n+    ${NS}::label $top.from -text [mc \"From:\"]\n+    ${NS}::entry $top.fromsha1 -width 40\n     $top.fromsha1 insert 0 $oldid\n     $top.fromsha1 conf -state readonly\n     grid $top.from $top.fromsha1 -sticky w\n-    entry $top.fromhead -width 60 -relief flat\n+    ${NS}::entry $top.fromhead -width 60\n     $top.fromhead insert 0 $oldhead\n     $top.fromhead conf -state readonly\n     grid x $top.fromhead -sticky w\n-    label $top.to -text [mc \"To:\"]\n-    entry $top.tosha1 -width 40 -relief flat\n+    ${NS}::label $top.to -text [mc \"To:\"]\n+    ${NS}::entry $top.tosha1 -width 40\n     $top.tosha1 insert 0 $newid\n     $top.tosha1 conf -state readonly\n     grid $top.to $top.tosha1 -sticky w\n-    entry $top.tohead -width 60 -relief flat\n+    ${NS}::entry $top.tohead -width 60\n     $top.tohead insert 0 $newhead\n     $top.tohead conf -state readonly\n     grid x $top.tohead -sticky w\n-    button $top.rev -text [mc \"Reverse\"] -command mkpatchrev -padx 5\n-    grid $top.rev x -pady 10\n-    label $top.flab -text [mc \"Output file:\"]\n-    entry $top.fname -width 60\n+    ${NS}::button $top.rev -text [mc \"Reverse\"] -command mkpatchrev\n+    grid $top.rev x -pady 10 -padx 5\n+    ${NS}::label $top.flab -text [mc \"Output file:\"]\n+    ${NS}::entry $top.fname -width 60\n     $top.fname insert 0 [file normalize \"patch$patchnum.patch\"]\n     incr patchnum\n     grid $top.flab $top.fname -sticky w\n-    frame $top.buts\n-    button $top.buts.gen -text [mc \"Generate\"] -command mkpatchgo\n-    button $top.buts.can -text [mc \"Cancel\"] -command mkpatchcan\n+    ${NS}::frame $top.buts\n+    ${NS}::button $top.buts.gen -text [mc \"Generate\"] -command mkpatchgo\n+    ${NS}::button $top.buts.can -text [mc \"Cancel\"] -command mkpatchcan\n     bind $top <Key-Return> mkpatchgo\n     bind $top <Key-Escape> mkpatchcan\n     grid $top.buts.gen $top.buts.can\n@@ -8159,30 +8251,30 @@ proc mkpatchcan {} {\n }\n \n proc mktag {} {\n-    global rowmenuid mktagtop commitinfo\n+    global rowmenuid mktagtop commitinfo NS\n \n     set top .maketag\n     set mktagtop $top\n     catch {destroy $top}\n-    toplevel $top\n+    ttk_toplevel $top\n     make_transient $top .\n-    label $top.title -text [mc \"Create tag\"]\n+    ${NS}::label $top.title -text [mc \"Create tag\"]\n     grid $top.title - -pady 10\n-    label $top.id -text [mc \"ID:\"]\n-    entry $top.sha1 -width 40 -relief flat\n+    ${NS}::label $top.id -text [mc \"ID:\"]\n+    ${NS}::entry $top.sha1 -width 40\n     $top.sha1 insert 0 $rowmenuid\n     $top.sha1 conf -state readonly\n     grid $top.id $top.sha1 -sticky w\n-    entry $top.head -width 60 -relief flat\n+    ${NS}::entry $top.head -width 60\n     $top.head insert 0 [lindex $commitinfo($rowmenuid) 0]\n     $top.head conf -state readonly\n     grid x $top.head -sticky w\n-    label $top.tlab -text [mc \"Tag name:\"]\n-    entry $top.tag -width 60\n+    ${NS}::label $top.tlab -text [mc \"Tag name:\"]\n+    ${NS}::entry $top.tag -width 60\n     grid $top.tlab $top.tag -sticky w\n-    frame $top.buts\n-    button $top.buts.gen -text [mc \"Create\"] -command mktaggo\n-    button $top.buts.can -text [mc \"Cancel\"] -command mktagcan\n+    ${NS}::frame $top.buts\n+    ${NS}::button $top.buts.gen -text [mc \"Create\"] -command mktaggo\n+    ${NS}::button $top.buts.can -text [mc \"Cancel\"] -command mktagcan\n     bind $top <Key-Return> mktaggo\n     bind $top <Key-Escape> mktagcan\n     grid $top.buts.gen $top.buts.can\n@@ -8262,34 +8354,34 @@ proc mktaggo {} {\n }\n \n proc writecommit {} {\n-    global rowmenuid wrcomtop commitinfo wrcomcmd\n+    global rowmenuid wrcomtop commitinfo wrcomcmd NS\n \n     set top .writecommit\n     set wrcomtop $top\n     catch {destroy $top}\n-    toplevel $top\n+    ttk_toplevel $top\n     make_transient $top .\n-    label $top.title -text [mc \"Write commit to file\"]\n+    ${NS}::label $top.title -text [mc \"Write commit to file\"]\n     grid $top.title - -pady 10\n-    label $top.id -text [mc \"ID:\"]\n-    entry $top.sha1 -width 40 -relief flat\n+    ${NS}::label $top.id -text [mc \"ID:\"]\n+    ${NS}::entry $top.sha1 -width 40\n     $top.sha1 insert 0 $rowmenuid\n     $top.sha1 conf -state readonly\n     grid $top.id $top.sha1 -sticky w\n-    entry $top.head -width 60 -relief flat\n+    ${NS}::entry $top.head -width 60\n     $top.head insert 0 [lindex $commitinfo($rowmenuid) 0]\n     $top.head conf -state readonly\n     grid x $top.head -sticky w\n-    label $top.clab -text [mc \"Command:\"]\n-    entry $top.cmd -width 60 -textvariable wrcomcmd\n+    ${NS}::label $top.clab -text [mc \"Command:\"]\n+    ${NS}::entry $top.cmd -width 60 -textvariable wrcomcmd\n     grid $top.clab $top.cmd -sticky w -pady 10\n-    label $top.flab -text [mc \"Output file:\"]\n-    entry $top.fname -width 60\n+    ${NS}::label $top.flab -text [mc \"Output file:\"]\n+    ${NS}::entry $top.fname -width 60\n     $top.fname insert 0 [file normalize \"commit-[string range $rowmenuid 0 6]\"]\n     grid $top.flab $top.fname -sticky w\n-    frame $top.buts\n-    button $top.buts.gen -text [mc \"Write\"] -command wrcomgo\n-    button $top.buts.can -text [mc \"Cancel\"] -command wrcomcan\n+    ${NS}::frame $top.buts\n+    ${NS}::button $top.buts.gen -text [mc \"Write\"] -command wrcomgo\n+    ${NS}::button $top.buts.can -text [mc \"Cancel\"] -command wrcomcan\n     bind $top <Key-Return> wrcomgo\n     bind $top <Key-Escape> wrcomcan\n     grid $top.buts.gen $top.buts.can\n@@ -8320,25 +8412,25 @@ proc wrcomcan {} {\n }\n \n proc mkbranch {} {\n-    global rowmenuid mkbrtop\n+    global rowmenuid mkbrtop NS\n \n     set top .makebranch\n     catch {destroy $top}\n-    toplevel $top\n+    ttk_toplevel $top\n     make_transient $top .\n-    label $top.title -text [mc \"Create new branch\"]\n+    ${NS}::label $top.title -text [mc \"Create new branch\"]\n     grid $top.title - -pady 10\n-    label $top.id -text [mc \"ID:\"]\n-    entry $top.sha1 -width 40 -relief flat\n+    ${NS}::label $top.id -text [mc \"ID:\"]\n+    ${NS}::entry $top.sha1 -width 40\n     $top.sha1 insert 0 $rowmenuid\n     $top.sha1 conf -state readonly\n     grid $top.id $top.sha1 -sticky w\n-    label $top.nlab -text [mc \"Name:\"]\n-    entry $top.name -width 40\n+    ${NS}::label $top.nlab -text [mc \"Name:\"]\n+    ${NS}::entry $top.name -width 40\n     grid $top.nlab $top.name -sticky w\n-    frame $top.buts\n-    button $top.buts.go -text [mc \"Create\"] -command [list mkbrgo $top]\n-    button $top.buts.can -text [mc \"Cancel\"] -command \"catch {destroy $top}\"\n+    ${NS}::frame $top.buts\n+    ${NS}::button $top.buts.go -text [mc \"Create\"] -command [list mkbrgo $top]\n+    ${NS}::button $top.buts.can -text [mc \"Cancel\"] -command \"catch {destroy $top}\"\n     bind $top <Key-Return> [list mkbrgo $top]\n     bind $top <Key-Escape> \"catch {destroy $top}\"\n     grid $top.buts.go $top.buts.can\n@@ -8483,34 +8575,31 @@ proc cherrypick {} {\n }\n \n proc resethead {} {\n-    global mainhead rowmenuid confirm_ok resettype\n+    global mainhead rowmenuid confirm_ok resettype NS\n \n     set confirm_ok 0\n     set w \".confirmreset\"\n-    toplevel $w\n+    ttk_toplevel $w\n     make_transient $w .\n     wm title $w [mc \"Confirm reset\"]\n-    message $w.m -text \\\n-\t[mc \"Reset branch %s to %s?\" $mainhead [string range $rowmenuid 0 7]] \\\n-\t-justify center -aspect 1000\n+    ${NS}::label $w.m -text \\\n+\t[mc \"Reset branch %s to %s?\" $mainhead [string range $rowmenuid 0 7]]\n     pack $w.m -side top -fill x -padx 20 -pady 20\n-    frame $w.f -relief sunken -border 2\n-    message $w.f.rt -text [mc \"Reset type:\"] -aspect 1000\n-    grid $w.f.rt -sticky w\n+    ${NS}::labelframe $w.f -text [mc \"Reset type:\"]\n     set resettype mixed\n-    radiobutton $w.f.soft -value soft -variable resettype -justify left \\\n+    ${NS}::radiobutton $w.f.soft -value soft -variable resettype \\\n \t-text [mc \"Soft: Leave working tree and index untouched\"]\n     grid $w.f.soft -sticky w\n-    radiobutton $w.f.mixed -value mixed -variable resettype -justify left \\\n+    ${NS}::radiobutton $w.f.mixed -value mixed -variable resettype \\\n \t-text [mc \"Mixed: Leave working tree untouched, reset index\"]\n     grid $w.f.mixed -sticky w\n-    radiobutton $w.f.hard -value hard -variable resettype -justify left \\\n+    ${NS}::radiobutton $w.f.hard -value hard -variable resettype \\\n \t-text [mc \"Hard: Reset working tree and index\\n(discard ALL local changes)\"]\n     grid $w.f.hard -sticky w\n-    pack $w.f -side top -fill x\n-    button $w.ok -text [mc OK] -command \"set confirm_ok 1; destroy $w\"\n+    pack $w.f -side top -fill x -padx 4\n+    ${NS}::button $w.ok -text [mc OK] -command \"set confirm_ok 1; destroy $w\"\n     pack $w.ok -side left -fill x -padx 20 -pady 20\n-    button $w.cancel -text [mc Cancel] -command \"destroy $w\"\n+    ${NS}::button $w.cancel -text [mc Cancel] -command \"destroy $w\"\n     bind $w <Key-Escape> [list destroy $w]\n     pack $w.cancel -side right -fill x -padx 20 -pady 20\n     bind $w <Visibility> \"grab $w; focus $w\"\n@@ -8658,7 +8747,7 @@ proc rmbranch {} {\n \n # Display a list of tags and heads\n proc showrefs {} {\n-    global showrefstop bgcolor fgcolor selectbgcolor\n+    global showrefstop bgcolor fgcolor selectbgcolor NS\n     global bglist fglist reflistfilter reflist maincursor\n \n     set top .showrefs\n@@ -8668,7 +8757,7 @@ proc showrefs {} {\n \trefill_reflist\n \treturn\n     }\n-    toplevel $top\n+    ttk_toplevel $top\n     wm title $top [mc \"Tags and heads: %s\" [file tail [pwd]]]\n     make_transient $top .\n     text $top.list -background $bgcolor -foreground $fgcolor \\\n@@ -8679,19 +8768,19 @@ proc showrefs {} {\n     $top.list tag configure highlight -background $selectbgcolor\n     lappend bglist $top.list\n     lappend fglist $top.list\n-    scrollbar $top.ysb -command \"$top.list yview\" -orient vertical\n-    scrollbar $top.xsb -command \"$top.list xview\" -orient horizontal\n+    ${NS}::scrollbar $top.ysb -command \"$top.list yview\" -orient vertical\n+    ${NS}::scrollbar $top.xsb -command \"$top.list xview\" -orient horizontal\n     grid $top.list $top.ysb -sticky nsew\n     grid $top.xsb x -sticky ew\n-    frame $top.f\n-    label $top.f.l -text \"[mc \"Filter\"]: \"\n-    entry $top.f.e -width 20 -textvariable reflistfilter\n+    ${NS}::frame $top.f\n+    ${NS}::label $top.f.l -text \"[mc \"Filter\"]: \"\n+    ${NS}::entry $top.f.e -width 20 -textvariable reflistfilter\n     set reflistfilter \"*\"\n     trace add variable reflistfilter write reflistfilter_change\n     pack $top.f.e -side right -fill x -expand 1\n     pack $top.f.l -side left\n     grid $top.f - -sticky ew -pady 2\n-    button $top.close -command [list destroy $top] -text [mc \"Close\"]\n+    ${NS}::button $top.close -command [list destroy $top] -text [mc \"Close\"]\n     bind $top <Key-Escape> [list destroy $top]\n     grid $top.close -\n     grid columnconfigure $top 0 -weight 1\n@@ -9986,19 +10075,20 @@ proc doquit {} {\n }\n \n proc mkfontdisp {font top which} {\n-    global fontattr fontpref $font\n+    global fontattr fontpref $font NS use_ttk\n \n     set fontpref($font) [set $font]\n-    button $top.${font}but -text $which -font optionfont \\\n+    ${NS}::button $top.${font}but -text $which \\\n \t-command [list choosefont $font $which]\n-    label $top.$font -relief flat -font $font \\\n+    if {!$use_ttk} {$top.${font}but configure  -font optionfont}\n+    ${NS}::label $top.$font -relief flat -font $font \\\n \t-text $fontattr($font,family) -justify left\n     grid x $top.${font}but $top.$font -sticky w\n }\n \n proc choosefont {font which} {\n     global fontparam fontlist fonttop fontattr\n-    global prefstop\n+    global prefstop NS\n \n     set fontparam(which) $which\n     set fontparam(font) $font\n@@ -10011,21 +10101,21 @@ proc choosefont {font which} {\n     if {![winfo exists $top]} {\n \tfont create sample\n \teval font config sample [font actual $font]\n-\ttoplevel $top\n+\tttk_toplevel $top\n \tmake_transient $top $prefstop\n \twm title $top [mc \"Gitk font chooser\"]\n-\tlabel $top.l -textvariable fontparam(which)\n+\t${NS}::label $top.l -textvariable fontparam(which)\n \tpack $top.l -side top\n \tset fontlist [lsort [font families]]\n-\tframe $top.f\n+\t${NS}::frame $top.f\n \tlistbox $top.f.fam -listvariable fontlist \\\n \t    -yscrollcommand [list $top.f.sb set]\n \tbind $top.f.fam <<ListboxSelect>> selfontfam\n-\tscrollbar $top.f.sb -command [list $top.f.fam yview]\n+\t${NS}::scrollbar $top.f.sb -command [list $top.f.fam yview]\n \tpack $top.f.sb -side right -fill y\n \tpack $top.f.fam -side left -fill both -expand 1\n \tpack $top.f -side top -fill both -expand 1\n-\tframe $top.g\n+\t${NS}::frame $top.g\n \tspinbox $top.g.size -from 4 -to 40 -width 4 \\\n \t    -textvariable fontparam(size) \\\n \t    -validatecommand {string is integer -strict %s}\n@@ -10043,9 +10133,9 @@ proc choosefont {font which} {\n \t    -fill black -tags text\n \tbind $top.c <Configure> [list centertext $top.c]\n \tpack $top.c -side top -fill x\n-\tframe $top.buts\n-\tbutton $top.buts.ok -text [mc \"OK\"] -command fontok -default active\n-\tbutton $top.buts.can -text [mc \"Cancel\"] -command fontcan -default normal\n+\t${NS}::frame $top.buts\n+\t${NS}::button $top.buts.ok -text [mc \"OK\"] -command fontok -default active\n+\t${NS}::button $top.buts.can -text [mc \"Cancel\"] -command fontcan -default normal\n \tbind $top <Key-Return> fontok\n \tbind $top <Key-Escape> fontcan\n \tgrid $top.buts.ok $top.buts.can\n@@ -10096,6 +10186,28 @@ proc fontcan {} {\n     }\n }\n \n+if {[package vsatisfies [package provide Tk] 8.6]} {\n+    # In Tk 8.6 we have a native font chooser dialog. Overwrite the above\n+    # function to make use of it.\n+    proc choosefont {font which} {\n+\ttk fontchooser configure -title $which -font $font \\\n+\t    -command [list on_choosefont $font $which]\n+\ttk fontchooser show\n+    }\n+    proc on_choosefont {font which newfont} {\n+\tglobal fontparam\n+\tputs stderr \"$font $newfont\"\n+\tarray set f [font actual $newfont]\n+\tset fontparam(which) $which\n+\tset fontparam(font) $font\n+\tset fontparam(family) $f(-family)\n+\tset fontparam(size) $f(-size)\n+\tset fontparam(weight) $f(-weight)\n+\tset fontparam(slant) $f(-slant)\n+\tfontok\n+    }\n+}\n+        \n proc selfontfam {} {\n     global fonttop fontparam\n \n@@ -10112,7 +10224,7 @@ proc chg_fontparam {v sub op} {\n }\n \n proc doprefs {} {\n-    global maxwidth maxgraphpct\n+    global maxwidth maxgraphpct use_ttk NS\n     global oldprefs prefstop showneartags showlocalchanges\n     global bgcolor fgcolor ctext diffcolors selectbgcolor markbgcolor\n     global tabstop limitdiffs autoselect extdifftool perfile_attrs\n@@ -10127,103 +10239,109 @@ proc doprefs {} {\n \t\t   limitdiffs tabstop perfile_attrs} {\n \tset oldprefs($v) [set $v]\n     }\n-    toplevel $top\n+    ttk_toplevel $top\n     wm title $top [mc \"Gitk preferences\"]\n     make_transient $top .\n-    label $top.ldisp -text [mc \"Commit list display options\"]\n+    ${NS}::label $top.ldisp -text [mc \"Commit list display options\"]\n     grid $top.ldisp - -sticky w -pady 10\n-    label $top.spacer -text \" \"\n-    label $top.maxwidthl -text [mc \"Maximum graph width (lines)\"] \\\n-\t-font optionfont\n+    ${NS}::label $top.spacer -text \" \"\n+    ${NS}::label $top.maxwidthl -text [mc \"Maximum graph width (lines)\"]\n     spinbox $top.maxwidth -from 0 -to 100 -width 4 -textvariable maxwidth\n     grid $top.spacer $top.maxwidthl $top.maxwidth -sticky w\n-    label $top.maxpctl -text [mc \"Maximum graph width (% of pane)\"] \\\n-\t-font optionfont\n+    ${NS}::label $top.maxpctl -text [mc \"Maximum graph width (% of pane)\"]\n     spinbox $top.maxpct -from 1 -to 100 -width 4 -textvariable maxgraphpct\n     grid x $top.maxpctl $top.maxpct -sticky w\n-    checkbutton $top.showlocal -text [mc \"Show local changes\"] \\\n-\t-font optionfont -variable showlocalchanges\n+    ${NS}::checkbutton $top.showlocal -text [mc \"Show local changes\"] \\\n+\t-variable showlocalchanges\n     grid x $top.showlocal -sticky w\n-    checkbutton $top.autoselect -text [mc \"Auto-select SHA1\"] \\\n-\t-font optionfont -variable autoselect\n+    ${NS}::checkbutton $top.autoselect -text [mc \"Auto-select SHA1\"] \\\n+\t-variable autoselect\n     grid x $top.autoselect -sticky w\n-\n-    label $top.ddisp -text [mc \"Diff display options\"]\n+    \n+    ${NS}::label $top.ddisp -text [mc \"Diff display options\"]\n     grid $top.ddisp - -sticky w -pady 10\n-    label $top.tabstopl -text [mc \"Tab spacing\"] -font optionfont\n+    ${NS}::label $top.tabstopl -text [mc \"Tab spacing\"]\n     spinbox $top.tabstop -from 1 -to 20 -width 4 -textvariable tabstop\n     grid x $top.tabstopl $top.tabstop -sticky w\n-    checkbutton $top.ntag -text [mc \"Display nearby tags\"] \\\n-\t-font optionfont -variable showneartags\n+    ${NS}::checkbutton $top.ntag -text [mc \"Display nearby tags\"] \\\n+\t-variable showneartags\n     grid x $top.ntag -sticky w\n-    checkbutton $top.ldiff -text [mc \"Limit diffs to listed paths\"] \\\n-\t-font optionfont -variable limitdiffs\n+    ${NS}::checkbutton $top.ldiff -text [mc \"Limit diffs to listed paths\"] \\\n+\t-variable limitdiffs\n     grid x $top.ldiff -sticky w\n-    checkbutton $top.lattr -text [mc \"Support per-file encodings\"] \\\n-\t-font optionfont -variable perfile_attrs\n+    ${NS}::checkbutton $top.lattr -text [mc \"Support per-file encodings\"] \\\n+\t-variable perfile_attrs\n     grid x $top.lattr -sticky w\n \n-    entry $top.extdifft -textvariable extdifftool\n-    frame $top.extdifff\n-    label $top.extdifff.l -text [mc \"External diff tool\" ] -font optionfont \\\n-\t-padx 10\n-    button $top.extdifff.b -text [mc \"Choose...\"] -font optionfont \\\n-\t-command choose_extdiff\n+    ${NS}::entry $top.extdifft -textvariable extdifftool\n+    ${NS}::frame $top.extdifff\n+    ${NS}::label $top.extdifff.l -text [mc \"External diff tool\" ]\n+    ${NS}::button $top.extdifff.b -text [mc \"Choose...\"] -command choose_extdiff\n     pack $top.extdifff.l $top.extdifff.b -side left\n-    grid x $top.extdifff $top.extdifft -sticky w\n+    pack configure $top.extdifff.l -padx 10\n+    grid x $top.extdifff $top.extdifft -sticky ew\n \n-    label $top.cdisp -text [mc \"Colors: press to choose\"]\n+    ${NS}::label $top.cdisp -text [mc \"Colors: press to choose\"]\n     grid $top.cdisp - -sticky w -pady 10\n     label $top.bg -padx 40 -relief sunk -background $bgcolor\n-    button $top.bgbut -text [mc \"Background\"] -font optionfont \\\n+    ${NS}::button $top.bgbut -text [mc \"Background\"] \\\n \t-command [list choosecolor bgcolor {} $top.bg [mc \"background\"] setbg]\n     grid x $top.bgbut $top.bg -sticky w\n     label $top.fg -padx 40 -relief sunk -background $fgcolor\n-    button $top.fgbut -text [mc \"Foreground\"] -font optionfont \\\n+    ${NS}::button $top.fgbut -text [mc \"Foreground\"] \\\n \t-command [list choosecolor fgcolor {} $top.fg [mc \"foreground\"] setfg]\n     grid x $top.fgbut $top.fg -sticky w\n     label $top.diffold -padx 40 -relief sunk -background [lindex $diffcolors 0]\n-    button $top.diffoldbut -text [mc \"Diff: old lines\"] -font optionfont \\\n+    ${NS}::button $top.diffoldbut -text [mc \"Diff: old lines\"] \\\n \t-command [list choosecolor diffcolors 0 $top.diffold [mc \"diff old lines\"] \\\n \t\t      [list $ctext tag conf d0 -foreground]]\n     grid x $top.diffoldbut $top.diffold -sticky w\n     label $top.diffnew -padx 40 -relief sunk -background [lindex $diffcolors 1]\n-    button $top.diffnewbut -text [mc \"Diff: new lines\"] -font optionfont \\\n+    ${NS}::button $top.diffnewbut -text [mc \"Diff: new lines\"] \\\n \t-command [list choosecolor diffcolors 1 $top.diffnew [mc \"diff new lines\"] \\\n \t\t      [list $ctext tag conf dresult -foreground]]\n     grid x $top.diffnewbut $top.diffnew -sticky w\n     label $top.hunksep -padx 40 -relief sunk -background [lindex $diffcolors 2]\n-    button $top.hunksepbut -text [mc \"Diff: hunk header\"] -font optionfont \\\n+    ${NS}::button $top.hunksepbut -text [mc \"Diff: hunk header\"] \\\n \t-command [list choosecolor diffcolors 2 $top.hunksep \\\n \t\t      [mc \"diff hunk header\"] \\\n \t\t      [list $ctext tag conf hunksep -foreground]]\n     grid x $top.hunksepbut $top.hunksep -sticky w\n     label $top.markbgsep -padx 40 -relief sunk -background $markbgcolor\n-    button $top.markbgbut -text [mc \"Marked line bg\"] -font optionfont \\\n+    ${NS}::button $top.markbgbut -text [mc \"Marked line bg\"] \\\n \t-command [list choosecolor markbgcolor {} $top.markbgsep \\\n \t\t      [mc \"marked line background\"] \\\n \t\t      [list $ctext tag conf omark -background]]\n     grid x $top.markbgbut $top.markbgsep -sticky w\n     label $top.selbgsep -padx 40 -relief sunk -background $selectbgcolor\n-    button $top.selbgbut -text [mc \"Select bg\"] -font optionfont \\\n+    ${NS}::button $top.selbgbut -text [mc \"Select bg\"] \\\n \t-command [list choosecolor selectbgcolor {} $top.selbgsep [mc \"background\"] setselbg]\n     grid x $top.selbgbut $top.selbgsep -sticky w\n \n-    label $top.cfont -text [mc \"Fonts: press to choose\"]\n+    ${NS}::label $top.cfont -text [mc \"Fonts: press to choose\"]\n     grid $top.cfont - -sticky w -pady 10\n     mkfontdisp mainfont $top [mc \"Main font\"]\n     mkfontdisp textfont $top [mc \"Diff display font\"]\n     mkfontdisp uifont $top [mc \"User interface font\"]\n \n-    frame $top.buts\n-    button $top.buts.ok -text [mc \"OK\"] -command prefsok -default active\n-    button $top.buts.can -text [mc \"Cancel\"] -command prefscan -default normal\n+    if {!$use_ttk} {\n+\tforeach w {maxpctl maxwidthl showlocal autoselect tabstopl ntag\n+\t    ldiff lattr extdifff.l extdifff.b bgbut fgbut \n+\t    diffoldbut diffnewbut hunksepbut markbgbut selbgbut} {\n+\t    $top.$w configure -font optionfont\n+\t}\n+    }\n+\n+    ${NS}::frame $top.buts\n+    ${NS}::button $top.buts.ok -text [mc \"OK\"] -command prefsok -default active\n+    ${NS}::button $top.buts.can -text [mc \"Cancel\"] -command prefscan -default normal\n     bind $top <Key-Return> prefsok\n     bind $top <Key-Escape> prefscan\n     grid $top.buts.ok $top.buts.can\n     grid columnconfigure $top.buts 0 -weight 1 -uniform a\n     grid columnconfigure $top.buts 1 -weight 1 -uniform a\n     grid $top.buts - - -pady 10 -sticky ew\n+    grid columnconfigure $top 2 -weight 1\n     bind $top <Visibility> \"focus $top.buts.ok\"\n }\n \n@@ -10886,6 +11004,10 @@ set nullid2 \"0000000000000000000000000000000000000001\"\n set nullfile \"/dev/null\"\n \n set have_tk85 [expr {[package vcompare $tk_version \"8.5\"] >= 0}]\n+if {![info exists use_ttk]} {\n+    set use_ttk [llength [info commands ::ttk::style]]\n+}\n+set NS [expr {$use_ttk ? \"ttk\" : \"\"}]\n \n set runq {}\n set history {}\n-- \n1.6.2.2.1669.g7eaf8\n"},{"id":"111478","messageId":"alpine.DEB.1.00.0904171206290.6675@intel-tinevez-2-302","threadId":"18909","inReplyTo":"873ac8m8jg.fsf@users.sourceforge.net","subject":"Re: [PATCH] gitk: use themed tk widgets","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2009-04-17T10:10:48Z","receivedAt":"2009-04-17T10:10:48Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Fri, 17 Apr 2009, Pat Thoyts wrote:\n\n> \n>   With Tk 8.5+ use the themed widgets to improve the appearence\n>   on Windows and MacOSX. On X11 less difference is apparent but\n>   users can select alternate themes by setting *TkTheme in the\n>   resource database (eg: *TkTheme: clam)\n> \n>   With Tk 8.6 there is a built-in font selection dialog and this\n>   patch will make use of that when available as on Windows and\n>   MacOSX it calls the native font selection dialog.\n\nI had several conflicts applying your patch, and I do not have object \na346bd5 here (not even fetching from Paul's repository), but I fixed them \nall up.  (In function setoptions(), you seemed to remove a part asking \nabout the windowingsystem being \"aqua\", but my gitk did not have that.)\n\nThe end result can be marveled at in 4msysgit's 'ttk' branch.\n\nI did not have time to go through your changes, though.\n\nBut can I place another wish with you?  It all looks nicer now, except the \ntext which is not anti-aliased...  Any chance to fix that?\n\nCiao,\nDscho\n"},{"id":"111485","messageId":"18920.32172.162401.593355@cargo.ozlabs.ibm.com","threadId":"18909","inReplyTo":"873ac8m8jg.fsf@users.sourceforge.net","subject":"Re: [PATCH] gitk: use themed tk widgets","fromName":"Paul Mackerras","fromEmail":"paulus@samba.org","sentAt":"2009-04-17T13:01:32Z","receivedAt":"2009-04-17T13:01:32Z","isPatch":true,"sender":{"key":"paulus@samba.org","avatar":"https://avatars.githubusercontent.com/u/1606439?v=4"},"body":"Pat Thoyts writes:\n\n>   With Tk 8.5+ use the themed widgets to improve the appearence\n>   on Windows and MacOSX. On X11 less difference is apparent but\n>   users can select alternate themes by setting *TkTheme in the\n>   resource database (eg: *TkTheme: clam)\n\nLooks nice, but the geometry restoration code doesn't seem to work\nwhen using the themed widgets.  I normally have gitk set so that the\ntop pane is about half the height of the bottom pane, but when I start\ngitk with this patch both panes always come up about the same height,\nno matter what sizes they had last time gitk ran.\n\nI notice that the code that restores the height and width of the top\npane is now inside if {!$use_ttk}.  Is there no way to restore the\npane layout with the themed widgets?\n\nPaul.\n"},{"id":"111522","messageId":"49E8CE80.9040308@users.sourceforge.net","threadId":"18909","inReplyTo":"alpine.DEB.1.00.0904171206290.6675@intel-tinevez-2-302","subject":"Re: [PATCH] gitk: use themed tk widgets","fromName":"Pat Thoyts","fromEmail":"patthoyts@users.sourceforge.net","sentAt":"2009-04-17T18:46:24Z","receivedAt":"2009-04-17T18:46:24Z","isPatch":true,"sender":{"key":"patthoyts@users.sourceforge.net","avatar":"https://avatars.githubusercontent.com/u/30739?v=4"},"body":"-----BEGIN PGP SIGNED MESSAGE-----\nHash: SHA1\n\nJohannes Schindelin wrote:\n> Hi,\n> \n> On Fri, 17 Apr 2009, Pat Thoyts wrote:\n> \n>>   With Tk 8.5+ use the themed widgets to improve the appearence\n>>   on Windows and MacOSX. On X11 less difference is apparent but\n>>   users can select alternate themes by setting *TkTheme in the\n>>   resource database (eg: *TkTheme: clam)\n>>\n>>   With Tk 8.6 there is a built-in font selection dialog and this\n>>   patch will make use of that when available as on Windows and\n>>   MacOSX it calls the native font selection dialog.\n> \n> I had several conflicts applying your patch, and I do not have object \n> a346bd5 here (not even fetching from Paul's repository), but I fixed them \n> all up.  (In function setoptions(), you seemed to remove a part asking \n> about the windowingsystem being \"aqua\", but my gitk did not have that.)\n> \n> The end result can be marveled at in 4msysgit's 'ttk' branch.\n> \n> I did not have time to go through your changes, though.\n> \n> But can I place another wish with you?  It all looks nicer now, except the \n> text which is not anti-aliased...  Any chance to fix that?\n\nAnti-aliased text is a feature of Tk 8.5 plus the support in your server\nand the chosen fonts. Not much to be done about that except choose a\nnice font. On Windows Tahoma and Consolas should look fine.\n\nI suspect the reason you have conflicts is the patch is generated\nagainst the gitk repository and not the git repository. There are some\ncommits in gitk that have not been merged to git yet and my patch lives\non top of those.\n\nPat Thoyts\n\n-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1.4.9 (MingW32)\nComment: Using GnuPG with Mozilla - http://enigmail.mozdev.org\n\niQCVAwUBSejOf2B90JXwhOSJAQI5LwQAkyP+975JkafktWYCe3Agd+i8tWrXqf0E\nNJqB/yF/WCNvqF8sVYzSnUdlxNDGalxE5Ehnoudg3Ca3AYm0LGsIgmNOBFXK+t9w\nhUKBIYwMfXInHzoJLVqzQ0n7Ql0o6XopgzyT8KW6ec5Vwkgosc3Y7PqX5VqOsCmo\neBU+8JkfnfE=\n=GPY9\n-----END PGP SIGNATURE-----\n"},{"id":"111538","messageId":"87vdp39d92.fsf_-_@users.sourceforge.net","threadId":"18909","inReplyTo":"18920.32172.162401.593355@cargo.ozlabs.ibm.com","subject":"[PATCH] gitk: restore pane sizes when using ttk widgets","fromName":"Pat Thoyts","fromEmail":"patthoyts@users.sourceforge.net","sentAt":"2009-04-17T21:33:29Z","receivedAt":"2009-04-17T21:33:29Z","isPatch":true,"sender":{"key":"patthoyts@users.sourceforge.net","avatar":"https://avatars.githubusercontent.com/u/30739?v=4"},"body":"\n  This patch applies the saved pane sizes for the ttk widgets. The\n  ttk paned window does not have a paneconfigure subcommand but we\n  can set the sash position once the widget gets mapped.\n\nSigned-off-by: Pat Thoyts <patthoyts@users.sourceforge.net>\n---\n gitk |   11 +++++++++++\n 1 files changed, 11 insertions(+), 0 deletions(-)\n\ndiff --git a/gitk b/gitk\nindex 053b1a0..8c6a239 100755\n--- a/gitk\n+++ b/gitk\n@@ -2326,6 +2326,17 @@ proc makewindow {} {\n         set ::BM \"2\"\n     }\n \n+    if {$use_ttk} {\n+        bind .ctop <Map> {\n+            bind %W <Map> {}\n+            %W sashpos 0 $::geometry(topheight)\n+        }\n+        bind .pwbottom <Map> {\n+            bind %W <Map> {}\n+            %W sashpos 0 $::geometry(botwidth)\n+        }\n+    }\n+\n     bind .pwbottom <Configure> {resizecdetpanes %W %w}\n     pack .ctop -fill both -expand 1\n     bindall <1> {selcanvline %W %x %y}\n-- \n1.6.2.2.1669.g7eaf8\n"},{"id":"112795","messageId":"18938.14504.726502.235277@cargo.ozlabs.ibm.com","threadId":"18909","inReplyTo":"87vdp39d92.fsf_-_@users.sourceforge.net","subject":"Re: [PATCH] gitk: restore pane sizes when using ttk widgets","fromName":"Paul Mackerras","fromEmail":"paulus@samba.org","sentAt":"2009-04-30T23:47:52Z","receivedAt":"2009-04-30T23:47:52Z","isPatch":true,"sender":{"key":"paulus@samba.org","avatar":"https://avatars.githubusercontent.com/u/1606439?v=4"},"body":"Pat Thoyts wrote:\n\n>   This patch applies the saved pane sizes for the ttk widgets. The\n>   ttk paned window does not have a paneconfigure subcommand but we\n>   can set the sash position once the widget gets mapped.\n\nThanks.  I folded that into your \"Use themed tk widgets\" patch and\napplied it on the dev branch.  There's still one little thing that\ndoesn't look quite right: the .tf.lbar.gdttype drop-down list\ninitially comes up empty (it should start out saying \"containing\") and\nit is also a little too short.  How do we fix that?\n\nPaul.\n"}]}