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>
main
Tim Culverhouse 2 months ago committed by Robin Jarry
parent 556f346f96
commit 7016c6f86a
  1. 2
      aerc.go
  2. 10
      lib/ui/ui.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)
}

@ -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

Loading…
Cancel
Save