summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Culverhouse <tim@timculverhouse.com>2022-10-17 15:16:10 -0500
committerRobin Jarry <robin@jarry.cc>2022-10-18 22:20:44 +0200
commit7016c6f86ae09b3e49eab665aa013628db4ee102 (patch)
tree3ffe1eebd8fea0e043ffcdbf3376a24aa51a2acc
parent556f346f96946a54223798685c445ec413a4031e (diff)
downloadaerc-7016c6f86ae09b3e49eab665aa013628db4ee102.tar.gz
aerc-7016c6f86ae09b3e49eab665aa013628db4ee102.zip
aercmsg: add AercFuncMsg and QueueFunc
Introduce AercFuncMsg and QueueFunc. These are used in combination to queue a function to be run in the main goroutine. This can be used to prevent data races in delayed function calls (ie from debounce functions). Signed-off-by: Tim Culverhouse <tim@timculverhouse.com> Acked-by: Robin Jarry <robin@jarry.cc>
-rw-r--r--aerc.go2
-rw-r--r--lib/ui/ui.go10
2 files changed, 12 insertions, 0 deletions
diff --git a/aerc.go b/aerc.go
index e5801a0c..1826567f 100644
--- a/aerc.go
+++ b/aerc.go
@@ -247,6 +247,8 @@ func main() {
switch event := event.(type) {
case tcell.Event:
ui.HandleEvent(event)
+ case *libui.AercFuncMsg:
+ event.Func()
case types.WorkerMessage:
aerc.HandleMessage(event)
}
diff --git a/lib/ui/ui.go b/lib/ui/ui.go
index 313f90d8..ea181d33 100644
--- a/lib/ui/ui.go
+++ b/lib/ui/ui.go
@@ -13,12 +13,22 @@ const (
var MsgChannel = make(chan AercMsg, 50)
+type AercFuncMsg struct {
+ Func func()
+}
+
// QueueRedraw sends a nil message into the MsgChannel. Nothing will handle this
// message, but a redraw will occur if the UI is marked as invalid
func QueueRedraw() {
MsgChannel <- nil
}
+// QueueFunc queues a function to be called in the main goroutine. This can be
+// used to prevent race conditions from delayed functions
+func QueueFunc(fn func()) {
+ MsgChannel <- &AercFuncMsg{Func: fn}
+}
+
// dirty is the dirty state of the UI. Any value other than 0 means the UI is in
// a dirty state. Dirty should only be accessed via atomic operations to
// maintain thread safety