87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
|
bind $W <Button> {
psballoon::killBalloon
}
bind $W <Leave> {
psballoon::killBalloon
}
bind $W <Motion> {
psballoon::motionBalloon %W %X %Y %x %y
}
}
proc psballoon::motionBalloon {W X Y x y} {
if {$::psballoon::balloon(pending) == 1} {
after cancel $::psballoon::balloon(id)
}
if {$::psballoon::balloon(created) == 1} {
if {$::psballoon::balloon(lastX) == %X && \
$::psballoon::balloon(lastY) == %Y} {
# Sometimes when the balloon is created, a motion event with
# the same coordinates arrive. Ignore that to avoid killing the
# new balloon.
return
}
psballoon::killBalloon
}
set ::psballoon::balloon(lastX) %X
set ::psballoon::balloon(lastY) %Y
set ::psballoon::balloon(id) [after 500 {psballoon::createBalloon %W %x %y}]
set ::psballoon::balloon(pending) 1
if {$::psballoon::balloon(pending) == 1} {
after cancel $::psballoon::balloon(id)
}
if {$::psballoon::balloon(created) == 1} {
if {$::psballoon::balloon(lastX) == $X && \
$::psballoon::balloon(lastY) == $Y} {
# Sometimes when the balloon is created, a motion event with
# the same coordinates arrive. Ignore that to avoid killing the
# new balloon.
return
}
psballoon::killBalloon
}
set ::psballoon::balloon(lastX) $X
set ::psballoon::balloon(lastY) $Y
set ::psballoon::balloon(id) [after 500 "psballoon::createBalloon $W $x $y"]
set ::psballoon::balloon(pending) 1
}
}
proc psballoon::killBalloon {} {
variable balloon
if {$balloon(pending) == 1} {
after cancel $balloon(id)
}
|