wails/exp/pkg/application/application_darwin.go
2022-12-16 21:09:31 +11:00

153 lines
3.2 KiB
Go

//go:build darwin
package application
/*
#cgo CFLAGS: -x objective-c
#cgo LDFLAGS: -framework Cocoa -mmacosx-version-min=10.13
#include "application.h"
#include "app_delegate.h"
#include "window_delegate.h"
#include <stdlib.h>
#import <Cocoa/Cocoa.h>
static AppDelegate *appDelegate = nil;
static void init(void) {
[NSApplication sharedApplication];
appDelegate = [[AppDelegate alloc] init];
[NSApp setDelegate:appDelegate];
}
static void setActivationPolicy(int policy) {
[appDelegate setApplicationActivationPolicy:policy];
}
static void run(void) {
@autoreleasepool {
[NSApp run];
[appDelegate release];
}
}
// Destroy application
static void destroyApp(void) {
[NSApp terminate:nil];
}
// Set the application menu
static void setApplicationMenu(void *menu) {
NSMenu *nsMenu = (__bridge NSMenu *)menu;
[NSApp setMainMenu:menu];
}
// Get the application name
static char* getAppName(void) {
NSString *appName = [NSRunningApplication currentApplication].localizedName;
if( appName == nil ) {
appName = [[NSProcessInfo processInfo] processName];
}
return strdup([appName UTF8String]);
}
// get the current window ID
static unsigned int getCurrentWindowID(void) {
NSWindow *window = [NSApp keyWindow];
// Get the window delegate
WindowDelegate *delegate = (WindowDelegate*)[window delegate];
return delegate.windowId;
}
*/
import "C"
import (
"unsafe"
"github.com/wailsapp/wails/exp/pkg/options"
)
type macosApp struct {
options *options.Application
applicationMenu unsafe.Pointer
}
func (m *macosApp) name() string {
appName := C.getAppName()
defer C.free(unsafe.Pointer(appName))
return C.GoString(appName)
}
func (m *macosApp) getCurrentWindowID() uint {
return uint(C.getCurrentWindowID())
}
func (m *macosApp) setApplicationMenu(menu *Menu) {
if menu == nil {
// Create a default menu for mac
menu = m.createDefaultApplicationMenu()
}
menu.Update()
// Convert impl to macosMenu object
m.applicationMenu = (menu.impl).(*macosMenu).nsMenu
C.setApplicationMenu(m.applicationMenu)
}
func (m *macosApp) run() error {
C.run()
return nil
}
func (m *macosApp) destroy() {
C.destroyApp()
}
func (m *macosApp) createDefaultApplicationMenu() *Menu {
// Create a default menu for mac
menu := NewMenu()
menu.AddRole(AppMenu)
menu.AddRole(FileMenu)
menu.AddRole(EditMenu)
menu.AddRole(ViewMenu)
return menu
}
func newPlatformApp(appOptions *options.Application) *macosApp {
if appOptions == nil {
appOptions = options.ApplicationDefaults
}
C.init()
C.setActivationPolicy(C.int(appOptions.Mac.ActivationPolicy))
return &macosApp{
options: appOptions,
}
}
//export processApplicationEvent
func processApplicationEvent(eventID C.uint) {
applicationEvents <- uint(eventID)
}
//export processWindowEvent
func processWindowEvent(windowID C.uint, eventID C.uint) {
windowEvents <- &WindowEvent{
WindowID: uint(windowID),
EventID: uint(eventID),
}
}
//export processMessage
func processMessage(windowID C.uint, message *C.char) {
windowMessageBuffer <- &windowMessage{
windowId: uint(windowID),
message: C.GoString(message),
}
}
//export processMenuItemClick
func processMenuItemClick(menuID C.uint) {
menuItemClicked <- uint(menuID)
}