Code

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 0aecf41e65a7ef6e06a75d1bd05b49eab03f2c02..97de595f2788ce28b4475bbbc726bfdd195ce434 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 98687c77daf2f5746b40674abc0e9fac8a0de7ed..139171d39edd343c48bfb3cb2a94b1437b596f07 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 fd86b11217cae2eab380362363cd7f4e8f79296a..3d6341bcc53d0e61b0817dcc5d9778f714b026b9 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 72494c1a1ea51ec004a63f08f2c62db9096c2318..9d298d0dcc7d305eded58911c3c0758e94bb7ab6 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 8c112f3a8924c1cc82dcaa0a78a85506be162a50..ce25d92cac7b7826d8e04adc18d6e8a3c133096d 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 24ed24b3d091230d186208bd3656867f3fea70a0..ae0389df5bfb13b2823720c241b861b7b36b9e95 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
 }