Reviewers: nigeltao,
Message:
Hello
nige...@golang.org (cc:
ta...@googlegroups.com),
I'd like you to review this change to
https://code.google.com/p/taowm/
Description:
taowm: when a onscreen window closes, move the most recently used
offscreen window into the freshly vacated frame.
Please review this at
https://codereview.appspot.com/7094060/
Affected files:
M taowm/geom.go
M taowm/main.go
Index: taowm/geom.go
===================================================================
--- a/taowm/geom.go
+++ b/taowm/geom.go
@@ -103,6 +103,7 @@
xWin xp.Window
rect xp.Rectangle
name string
+ offscreenSeqNum uint32
hasTransientFor bool
seen bool
selected bool
@@ -437,6 +438,8 @@
[]xp.Rectangle{f.rect}))
}
+var nextOffscreenSeqNum uint32 = 1
+
func (w *window) property(a xp.Atom) string {
p, err := xp.GetProperty(xConn, false, w.xWin, a, xp.GetPropertyTypeAny,
0, 1<<32-1).Reply()
if err != nil {
@@ -486,6 +489,8 @@
0,
}
} else {
+ w.offscreenSeqNum = nextOffscreenSeqNum
+ nextOffscreenSeqNum++
mask = xp.ConfigWindowX | xp.ConfigWindowY
values = []uint32{
uint32(uint16(r.X)),
Index: taowm/main.go
===================================================================
--- a/taowm/main.go
+++ b/taowm/main.go
@@ -199,8 +199,6 @@
if quitting && findWindow(func(w *window) bool { return true }) == nil {
os.Exit(0)
}
- w.link[next].link[prev] = w.link[prev]
- w.link[prev].link[next] = w.link[next]
if w.hasTransientFor {
for {
w1 := findWindow(func(w2 *window) bool { return w2.transientFor == w })
@@ -211,18 +209,31 @@
}
}
if f := w.frame; f != nil {
+ replacement := (*window)(nil)
if w.transientFor != nil && w.transientFor.frame == nil {
- f.window, w.transientFor.frame = w.transientFor, f
- w.transientFor.configure()
+ replacement = w.transientFor
+ } else {
+ bestOffscreenSeqNum := uint32(0)
+ for w1 := w.link[next]; w1 != w; w1 = w1.link[next] {
+ if w1.offscreenSeqNum > bestOffscreenSeqNum && w1.frame == nil {
+ replacement, bestOffscreenSeqNum = w1, w1.offscreenSeqNum
+ }
+ }
+ }
+ if replacement != nil {
+ f.window, replacement.frame = replacement, f
+ replacement.configure()
if p, err := xp.QueryPointer(xConn, rootXWin).Reply(); err != nil {
log.Println(err)
} else if contains(f.rect, p.RootX, p.RootY) {
- focus(w.transientFor)
+ focus(replacement)
}
} else {
f.window = nil
}
}
+ w.link[next].link[prev] = w.link[prev]
+ w.link[prev].link[next] = w.link[next]
*w = window{}
makeLists()
pulseChan <- time.Now()