set _iscygwin 0
} else {
set _iscygwin 1
+ # Handle MSys2 which is only cygwin when MSYSTEM is MSYS.
+ if {[info exists ::env(MSYSTEM)] && $::env(MSYSTEM) ne "MSYS"} {
+ set _iscygwin 0
+ }
}
} else {
set _iscygwin 0
if {[file isfile [gitdir MERGE_MSG]]} {
set pcm_source "merge"
set fd_mm [open [gitdir MERGE_MSG] r]
+ fconfigure $fd_mm -encoding utf-8
puts -nonewline $fd_pcm [read $fd_mm]
close $fd_mm
} elseif {[file isfile [gitdir SQUASH_MSG]]} {
set pcm_source "squash"
set fd_sm [open [gitdir SQUASH_MSG] r]
+ fconfigure $fd_sm -encoding utf-8
puts -nonewline $fd_pcm [read $fd_sm]
close $fd_sm
} else {
}
}
- proc toggle_or_diff {w x y} {
+ proc toggle_or_diff {mode w args} {
global file_states file_lists current_diff_path ui_index ui_workdir
global last_clicked selected_paths
- set pos [split [$w index @$x,$y] .]
- set lno [lindex $pos 0]
- set col [lindex $pos 1]
+ if {$mode eq "click"} {
+ foreach {x y} $args break
+ set pos [split [$w index @$x,$y] .]
+ foreach {lno col} $pos break
+ } else {
+ if {$last_clicked ne {}} {
+ set lno [lindex $last_clicked 1]
+ } else {
+ set lno [expr {int([lindex [$w tag ranges in_diff] 0])}]
+ }
+ if {$mode eq "toggle"} {
+ set col 0; set y 2
+ } else {
+ incr lno [expr {$mode eq "up" ? -1 : 1}]
+ set col 1
+ }
+ }
+
set path [lindex $file_lists($w) [expr {$lno - 1}]]
if {$path eq {}} {
set last_clicked {}
}
set last_clicked [list $w $lno]
+ focus $w
array unset selected_paths
$ui_index tag remove in_sel 0.0 end
$ui_workdir tag remove in_sel 0.0 end
global file_lists last_clicked selected_paths
if {[lindex $last_clicked 0] ne $w} {
- toggle_or_diff $w $x $y
+ toggle_or_diff click $w $x $y
return
}
}
pack .vpane -anchor n -side top -fill both -expand 1
+ # -- Working Directory File List
+
+ textframe .vpane.files.workdir -height 100 -width 200
+ tlabel .vpane.files.workdir.title -text [mc "Unstaged Changes"] \
+ -background lightsalmon -foreground black
+ ttext $ui_workdir -background white -foreground black \
+ -borderwidth 0 \
+ -width 20 -height 10 \
+ -wrap none \
+ -takefocus 1 -highlightthickness 1\
+ -cursor $cursor_ptr \
+ -xscrollcommand {.vpane.files.workdir.sx set} \
+ -yscrollcommand {.vpane.files.workdir.sy set} \
+ -state disabled
+ ${NS}::scrollbar .vpane.files.workdir.sx -orient h -command [list $ui_workdir xview]
+ ${NS}::scrollbar .vpane.files.workdir.sy -orient v -command [list $ui_workdir yview]
+ pack .vpane.files.workdir.title -side top -fill x
+ pack .vpane.files.workdir.sx -side bottom -fill x
+ pack .vpane.files.workdir.sy -side right -fill y
+ pack $ui_workdir -side left -fill both -expand 1
+
# -- Index File List
#
- ${NS}::frame .vpane.files.index -height 100 -width 200
+ textframe .vpane.files.index -height 100 -width 200
tlabel .vpane.files.index.title \
-text [mc "Staged Changes (Will Commit)"] \
-background lightgreen -foreground black
- text $ui_index -background white -foreground black \
+ ttext $ui_index -background white -foreground black \
-borderwidth 0 \
-width 20 -height 10 \
-wrap none \
+ -takefocus 1 -highlightthickness 1\
-cursor $cursor_ptr \
-xscrollcommand {.vpane.files.index.sx set} \
-yscrollcommand {.vpane.files.index.sy set} \
pack .vpane.files.index.sy -side right -fill y
pack $ui_index -side left -fill both -expand 1
- # -- Working Directory File List
+ # -- Insert the workdir and index into the panes
#
- ${NS}::frame .vpane.files.workdir -height 100 -width 200
- tlabel .vpane.files.workdir.title -text [mc "Unstaged Changes"] \
- -background lightsalmon -foreground black
- text $ui_workdir -background white -foreground black \
- -borderwidth 0 \
- -width 20 -height 10 \
- -wrap none \
- -cursor $cursor_ptr \
- -xscrollcommand {.vpane.files.workdir.sx set} \
- -yscrollcommand {.vpane.files.workdir.sy set} \
- -state disabled
- ${NS}::scrollbar .vpane.files.workdir.sx -orient h -command [list $ui_workdir xview]
- ${NS}::scrollbar .vpane.files.workdir.sy -orient v -command [list $ui_workdir yview]
- pack .vpane.files.workdir.title -side top -fill x
- pack .vpane.files.workdir.sx -side bottom -fill x
- pack .vpane.files.workdir.sy -side right -fill y
- pack $ui_workdir -side left -fill both -expand 1
-
.vpane.files add .vpane.files.workdir
.vpane.files add .vpane.files.index
if {!$use_ttk} {
#
${NS}::frame .vpane.lower.commarea.buffer
${NS}::frame .vpane.lower.commarea.buffer.header
- set ui_comm .vpane.lower.commarea.buffer.t
+ set ui_comm .vpane.lower.commarea.buffer.frame.t
set ui_coml .vpane.lower.commarea.buffer.header.l
if {![is_enabled nocommit]} {
pack .vpane.lower.commarea.buffer.header.new -side right
}
- text $ui_comm -background white -foreground black \
+ textframe .vpane.lower.commarea.buffer.frame
+ ttext $ui_comm -background white -foreground black \
-borderwidth 1 \
-undo true \
-maxundo 20 \
-autoseparators true \
+ -takefocus 1 \
+ -highlightthickness 1 \
-relief sunken \
-width $repo_config(gui.commitmsgwidth) -height 9 -wrap none \
-font font_diff \
- -yscrollcommand {.vpane.lower.commarea.buffer.sby set}
- ${NS}::scrollbar .vpane.lower.commarea.buffer.sby \
+ -yscrollcommand {.vpane.lower.commarea.buffer.frame.sby set}
+ ${NS}::scrollbar .vpane.lower.commarea.buffer.frame.sby \
-command [list $ui_comm yview]
- pack .vpane.lower.commarea.buffer.header -side top -fill x
- pack .vpane.lower.commarea.buffer.sby -side right -fill y
+
+ pack .vpane.lower.commarea.buffer.frame.sby -side right -fill y
pack $ui_comm -side left -fill y
+ pack .vpane.lower.commarea.buffer.header -side top -fill x
+ pack .vpane.lower.commarea.buffer.frame -side left -fill y
pack .vpane.lower.commarea.buffer -side left -fill y
# -- Commit Message Buffer Context Menu
# -- Diff Body
#
- ${NS}::frame .vpane.lower.diff.body
+ textframe .vpane.lower.diff.body
set ui_diff .vpane.lower.diff.body.t
- text $ui_diff -background white -foreground black \
+ ttext $ui_diff -background white -foreground black \
-borderwidth 0 \
-width 80 -height 5 -wrap none \
-font font_diff \
+ -takefocus 1 -highlightthickness 1 \
-xscrollcommand {.vpane.lower.diff.body.sbx set} \
-yscrollcommand {.vpane.lower.diff.body.sby set} \
-state disabled
bind . <$M1B-Key-R> ui_do_rescan
bind . <$M1B-Key-s> do_signoff
bind . <$M1B-Key-S> do_signoff
- bind . <$M1B-Key-t> do_add_selection
- bind . <$M1B-Key-T> do_add_selection
- bind . <$M1B-Key-u> do_unstage_selection
- bind . <$M1B-Key-U> do_unstage_selection
+ bind . <$M1B-Key-t> { toggle_or_diff toggle %W }
+ bind . <$M1B-Key-T> { toggle_or_diff toggle %W }
+ bind . <$M1B-Key-u> { toggle_or_diff toggle %W }
+ bind . <$M1B-Key-U> { toggle_or_diff toggle %W }
bind . <$M1B-Key-j> do_revert_selection
bind . <$M1B-Key-J> do_revert_selection
bind . <$M1B-Key-i> do_add_all
bind . <$M1B-Key-KP_Add> {show_more_context;break}
bind . <$M1B-Key-Return> do_commit
foreach i [list $ui_index $ui_workdir] {
- bind $i <Button-1> "toggle_or_diff $i %x %y; break"
- bind $i <$M1B-Button-1> "add_one_to_selection $i %x %y; break"
- bind $i <Shift-Button-1> "add_range_to_selection $i %x %y; break"
+ bind $i <Button-1> { toggle_or_diff click %W %x %y; break }
+ bind $i <$M1B-Button-1> { add_one_to_selection %W %x %y; break }
+ bind $i <Shift-Button-1> { add_range_to_selection %W %x %y; break }
+ bind $i <Key-Up> { toggle_or_diff up %W; break }
+ bind $i <Key-Down> { toggle_or_diff down %W; break }
}
unset i