privacy selector
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
package privacy
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
)
|
||||
|
||||
const inputMarker uintptr = 0x00D5E7B00B5
|
||||
|
||||
type Manager struct {
|
||||
mu sync.Mutex
|
||||
enabled int32
|
||||
}
|
||||
|
||||
var global = &Manager{}
|
||||
|
||||
func Get() *Manager { return global }
|
||||
|
||||
func (m *Manager) IsEnabled() bool {
|
||||
return atomic.LoadInt32(&m.enabled) != 0
|
||||
}
|
||||
|
||||
func (m *Manager) Enable() error {
|
||||
m.mu.Lock()
|
||||
defer m.mu.Unlock()
|
||||
|
||||
if atomic.LoadInt32(&m.enabled) != 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := enablePlatform(); err != nil {
|
||||
atomic.StoreInt32(&m.enabled, 0)
|
||||
return err
|
||||
}
|
||||
|
||||
atomic.StoreInt32(&m.enabled, 1)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Manager) Disable() {
|
||||
m.mu.Lock()
|
||||
defer m.mu.Unlock()
|
||||
|
||||
if atomic.SwapInt32(&m.enabled, 0) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
disablePlatform()
|
||||
}
|
||||
|
||||
func Start() error { return Get().Enable() }
|
||||
func Stop() { Get().Disable() }
|
||||
func IsEnabled() bool { return Get().IsEnabled() }
|
||||
func InputMarker() uintptr { return inputMarker }
|
||||
Reference in New Issue
Block a user