-
-
Notifications
You must be signed in to change notification settings - Fork 77
Open
Description
I was wondering if one could replace the CGO binding on some platforms by using ebitengine/purego?
Here an example for clipboard_darwin.go (not tested though, generated with an LLM to give an idea):
package systray
import (
"time"
"unsafe"
"github.com/ebitengine/purego"
"github.com/ebitengine/purego/objc"
)
var st = &systray{}
type systray struct {
}
// Objective-C selectors
var (
showMenuSelector objc.Selector
setIconSelector objc.Selector
setMenuItemIconSelector objc.Selector
registerSystraySelector objc.Selector
nativeLoopSelector objc.Selector
nativeEndSelector objc.Selector
nativeStartSelector objc.Selector
quitSelector objc.Selector
setInternalLoopSelector objc.Selector
createMenuSelector objc.Selector
setMenuNilSelector objc.Selector
resetMenuSelector objc.Selector
addOrUpdateMenuItemSelector objc.Selector
)
func init() {
objc.LoadFramework("Cocoa", "/System/Library/Frameworks/Cocoa.framework")
showMenuSelector = objc.GetSelector("showMenu")
setIconSelector = objc.GetSelector("setIcon:withLength:template:")
setMenuItemIconSelector = objc.GetSelector("setMenuItemIcon:withLength:id:template:")
registerSystraySelector = objc.GetSelector("registerSystray")
nativeLoopSelector = objc.GetSelector("nativeLoop")
nativeEndSelector = objc.GetSelector("nativeEnd")
nativeStartSelector = objc.GetSelector("nativeStart")
quitSelector = objc.GetSelector("quit")
setInternalLoopSelector = objc.GetSelector("setInternalLoop:")
createMenuSelector = objc.GetSelector("createMenu")
setMenuNilSelector = objc.GetSelector("setMenuNil")
resetMenuSelector = objc.GetSelector("resetMenu")
addOrUpdateMenuItemSelector = objc.GetSelector("addOrUpdateMenuItemWithID:parentID:title:tooltip:shortcut:disabled:checked:checkable:")
}
func (m *systray) ShowMenu() error {
objc.Call("SystrayManager", showMenuSelector)
return nil
}
func SetTemplateIcon(templateIconBytes []byte, regularIconBytes []byte) {
iconPtr := unsafe.Pointer(&templateIconBytes[0])
objc.Call("SystrayManager", setIconSelector, iconPtr, len(templateIconBytes), true)
}
func (item *MenuItem) SetIcon(iconBytes []byte) {
iconPtr := unsafe.Pointer(&iconBytes[0])
objc.Call("SystrayManager", setMenuItemIconSelector, iconPtr, len(iconBytes), item.id, false)
}
func (item *MenuItem) SetTemplateIcon(templateIconBytes []byte, regularIconBytes []byte) {
iconPtr := unsafe.Pointer(&templateIconBytes[0])
objc.Call("SystrayManager", setMenuItemIconSelector, iconPtr, len(templateIconBytes), item.id, true)
}
func registerSystray() {
objc.Call("SystrayManager", registerSystraySelector)
}
func nativeLoop() {
objc.Call("SystrayManager", nativeLoopSelector)
}
func nativeEnd() {
objc.Call("SystrayManager", nativeEndSelector)
}
func nativeStart() {
objc.Call("SystrayManager", nativeStartSelector)
}
func quit() {
objc.Call("SystrayManager", quitSelector)
}
func setInternalLoop(internal bool) {
objc.Call("SystrayManager", setInternalLoopSelector, internal)
}
func CreateMenu() {
objc.Call("SystrayManager", createMenuSelector)
}
func SetMenuNil() {
objc.Call("SystrayManager", setMenuNilSelector)
}
func SetIcon(iconBytes []byte) {
iconPtr := unsafe.Pointer(&iconBytes[0])
objc.Call("SystrayManager", setIconSelector, iconPtr, len(iconBytes), false)
}
func SetTitle(title string) {
titlePtr := objc.StringToNSString(title)
objc.Call("SystrayManager", "setTitle:", titlePtr)
}
func SetTooltip(tooltip string) {
tooltipPtr := objc.StringToNSString(tooltip)
objc.Call("SystrayManager", "setTooltip:", tooltipPtr)
}
func addOrUpdateMenuItem(item *MenuItem) {
var disabled, checked, isCheckable int
if item.disabled {
disabled = 1
}
if item.checked {
checked = 1
}
if item.isCheckable {
isCheckable = 1
}
parentID := 0
if item.parent != nil {
parentID = int(item.parent.id)
}
objc.Call("SystrayManager", addOrUpdateMenuItemSelector, item.id, parentID, item.title, item.tooltip, item.shortcutKey, disabled, checked, isCheckable)
}
func addSeparator(id uint32) {
objc.Call("SystrayManager", "addSeparator:", id)
}
func hideMenuItem(item *MenuItem) {
objc.Call("SystrayManager", "hideMenuItem:", item.id)
}
func showMenuItem(item *MenuItem) {
objc.Call("SystrayManager", "showMenuItem:", item.id)
}
}
func resetMenu() {
objc.Call("SystrayManager", resetMenuSelector)
}
func enableOnClick() {
if !isEnableOnClick {
isEnableOnClick = true
objc.Call("SystrayManager", "enableOnClick")
}
}
func systray_ready() {
if systrayReady != nil {
systrayReady()
}
}
func systray_on_exit() {
systrayExit()
}
func systray_menu_item_selected(cID int) {
systrayMenuItemSelected(uint32(cID))
}
func systray_on_click() {
if dClickTime == 0 {
dClickTime = time.Now().UnixMilli()
} else {
nowMilli := time.Now().UnixMilli()
if nowMilli-dClickTime < dClickTimeMinInterval {
dClickTime = dClickTimeMinInterval
if onDClick != nil {
onDClick(st)
return
}
} else {
dClickTime = nowMilli
}
}
if onClick != nil {
onClick(st)
}
}
func systray_on_rclick() {
if onRClick != nil {
onRClick(st)
} else {
objc.Call("SystrayManager", showMenuSelector)
}
}
Metadata
Metadata
Assignees
Labels
No labels