mirror of
https://github.com/safing/portmaster
synced 2025-04-22 20:09:09 +00:00
90 lines
1.8 KiB
Go
90 lines
1.8 KiB
Go
//go:build windows
|
|
|
|
package wintoast
|
|
|
|
import (
|
|
"unsafe"
|
|
|
|
"golang.org/x/sys/windows"
|
|
)
|
|
|
|
type NotificationBuilder struct {
|
|
templatePointer uintptr
|
|
lib *WinToast
|
|
}
|
|
|
|
func newNotification(lib *WinToast, title string, message string) (*NotificationBuilder, error) {
|
|
lib.Lock()
|
|
defer lib.Unlock()
|
|
|
|
titleUTF, _ := windows.UTF16PtrFromString(title)
|
|
messageUTF, _ := windows.UTF16PtrFromString(message)
|
|
titleP := unsafe.Pointer(titleUTF)
|
|
messageP := unsafe.Pointer(messageUTF)
|
|
|
|
ptr, _, err := lib.createNotification.Call(uintptr(titleP), uintptr(messageP))
|
|
if ptr == 0 {
|
|
return nil, err
|
|
}
|
|
|
|
return &NotificationBuilder{ptr, lib}, nil
|
|
}
|
|
|
|
func (n *NotificationBuilder) Delete() {
|
|
if n == nil {
|
|
return
|
|
}
|
|
|
|
n.lib.Lock()
|
|
defer n.lib.Unlock()
|
|
|
|
_, _, _ = n.lib.deleteNotification.Call(n.templatePointer)
|
|
}
|
|
|
|
func (n *NotificationBuilder) AddButton(text string) error {
|
|
n.lib.Lock()
|
|
defer n.lib.Unlock()
|
|
textUTF, _ := windows.UTF16PtrFromString(text)
|
|
textP := unsafe.Pointer(textUTF)
|
|
|
|
rc, _, err := n.lib.addButton.Call(n.templatePointer, uintptr(textP))
|
|
if rc != 1 {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (n *NotificationBuilder) SetImage(iconPath string) error {
|
|
n.lib.Lock()
|
|
defer n.lib.Unlock()
|
|
pathUTF, _ := windows.UTF16PtrFromString(iconPath)
|
|
pathP := unsafe.Pointer(pathUTF)
|
|
|
|
rc, _, err := n.lib.setImage.Call(n.templatePointer, uintptr(pathP))
|
|
if rc != 1 {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (n *NotificationBuilder) SetSound(option int, path int) error {
|
|
n.lib.Lock()
|
|
defer n.lib.Unlock()
|
|
|
|
rc, _, err := n.lib.setSound.Call(n.templatePointer, uintptr(option), uintptr(path))
|
|
if rc != 1 {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (n *NotificationBuilder) Show() (int64, error) {
|
|
n.lib.Lock()
|
|
defer n.lib.Unlock()
|
|
|
|
id, _, err := n.lib.showNotification.Call(n.templatePointer)
|
|
if int64(id) == -1 {
|
|
return -1, err
|
|
}
|
|
return int64(id), nil
|
|
}
|