mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-08-02 03:28:28 -04:00
0cdb065739
binary to mount at runtime, -c or DMS_SHELL_DIR overrides required to explicitly override embedded configuration
49 lines
841 B
Go
49 lines
841 B
Go
package apppicker
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/AvengeMedia/dankgo/syncmap"
|
|
)
|
|
|
|
type Manager struct {
|
|
subscribers syncmap.Map[string, chan OpenEvent]
|
|
closeOnce sync.Once
|
|
}
|
|
|
|
func NewManager() *Manager {
|
|
return &Manager{}
|
|
}
|
|
|
|
func (m *Manager) Subscribe(id string) chan OpenEvent {
|
|
ch := make(chan OpenEvent, 16)
|
|
m.subscribers.Store(id, ch)
|
|
return ch
|
|
}
|
|
|
|
func (m *Manager) Unsubscribe(id string) {
|
|
if val, ok := m.subscribers.LoadAndDelete(id); ok {
|
|
close(val)
|
|
}
|
|
}
|
|
|
|
func (m *Manager) RequestOpen(event OpenEvent) {
|
|
m.subscribers.Range(func(key string, ch chan OpenEvent) bool {
|
|
select {
|
|
case ch <- event:
|
|
default:
|
|
}
|
|
return true
|
|
})
|
|
}
|
|
|
|
func (m *Manager) Close() {
|
|
m.closeOnce.Do(func() {
|
|
m.subscribers.Range(func(key string, ch chan OpenEvent) bool {
|
|
close(ch)
|
|
m.subscribers.Delete(key)
|
|
return true
|
|
})
|
|
})
|
|
}
|