]> Kevux Git Server - rit/commitdiff
git-gui: Save geometry before the window layout is damaged
authorShawn O. Pearce <spearce@spearce.org>
Tue, 12 Jun 2007 03:52:43 +0000 (23:52 -0400)
committerShawn O. Pearce <spearce@spearce.org>
Tue, 12 Jun 2007 03:52:43 +0000 (23:52 -0400)
Because Tk does not assure us the order that it will process
children in before it destroys the main toplevel we cannot safely
save our geometry data during a "bind . <Destroy>" event binding.
The geometry may have already changed as a result of a one or
more children being removed from the layout.  This was pointed
out in gitk by Mark Levedahl, and patched over there by commit
b6047c5a8166a71e01c6b63ebbb67c6894d95114.

So we now also use "wm protocol . WM_DELETE_WINDOW" to detect when
the window is closed by the user, and forward that close event to
our main do_quit routine.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
git-gui.sh
lib/blame.tcl
lib/browser.tcl
lib/class.tcl
lib/console.tcl
lib/merge.tcl

index 0aecf41..97de595 100755 (executable)
@@ -1622,7 +1622,7 @@ unset browser doc_path doc_url
 
 # -- Standard bindings
 #
-bind .   <Destroy> {if {{%W} eq {.}} do_quit}
+wm protocol . WM_DELETE_WINDOW do_quit
 bind all <$M1B-Key-q> do_quit
 bind all <$M1B-Key-Q> do_quit
 bind all <$M1B-Key-w> {destroy [winfo toplevel %W]}
index 98687c7..139171d 100644 (file)
@@ -289,7 +289,6 @@ constructor new {i_commit i_path} {
 
        bind $w_cviewer <Button-1> [list focus $w_cviewer]
        bind $top <Visibility> [list focus $top]
-       bind $w_file <Destroy> [list delete_this $this]
 
        grid configure $w.header -sticky ew
        grid configure $w.file_pane -sticky nsew
index fd86b11..3d6341b 100644 (file)
@@ -70,7 +70,6 @@ constructor new {commit} {
        bind $w_list <Right>           break
 
        bind $w_list <Visibility> [list focus $w_list]
-       bind $w_list <Destroy> [list delete_this $this]
        set w $w_list
        _ls $this $browser_commit
        return $this
index 72494c1..9d298d0 100644 (file)
@@ -120,10 +120,21 @@ proc delete_this {{t {}}} {
        if {[namespace exists $t]} {namespace delete $t}
 }
 
-proc make_toplevel {t w} {
-       upvar $t top $w pfx
+proc make_toplevel {t w args} {
+       upvar $t top $w pfx this this
+
+       if {[llength $args] % 2} {
+               error "make_toplevel topvar winvar {options}"
+       }
+       set autodelete 1
+       foreach {name value} $args {
+               switch -exact -- $name {
+               -autodelete {set autodelete $value}
+               default     {error "unsupported option $name"}
+               }
+       }
+
        if {[winfo ismapped .]} {
-               upvar this this
                regsub -all {::} $this {__} w
                set top .$w
                set pfx $top
@@ -132,6 +143,13 @@ proc make_toplevel {t w} {
                set top .
                set pfx {}
        }
+
+       if {$autodelete} {
+               wm protocol $top WM_DELETE_WINDOW "
+                       [list delete_this $this]
+                       [list destroy $top]
+               "
+       }
 }
 
 
index 8c112f3..ce25d92 100644 (file)
@@ -17,7 +17,7 @@ constructor new {short_title long_title} {
 
 method _init {} {
        global M1B
-       make_toplevel top w
+       make_toplevel top w -autodelete 0
        wm title $top "[appname] ([reponame]): $t_short"
        set console_cr 1.0
 
index 24ed24b..ae0389d 100644 (file)
@@ -125,7 +125,8 @@ Please select fewer branches.  To merge more than 15 branches, merge the branche
        set cons [console::new "Merge" $msg]
        console::exec $cons $cmd \
                [namespace code [list _finish $revcnt $cons]]
-       bind $w <Destroy> {}
+
+       wm protocol $w WM_DELETE_WINDOW {}
        destroy $w
 }
 
@@ -250,7 +251,7 @@ proc dialog {} {
        bind $w <$M1B-Key-Return> $_start
        bind $w <Visibility> "grab $w; focus $w.source.l"
        bind $w <Key-Escape> "unlock_index;destroy $w"
-       bind $w <Destroy> unlock_index
+       wm protocol $w WM_DELETE_WINDOW "unlock_index;destroy $w"
        wm title $w "[appname] ([reponame]): Merge"
        tkwait window $w
 }