mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-02 17:39:58 +08:00

* implement MacOS openFile/openFiles events * wip: windows file association * fix macro import * add file icon copy * try copy icon * keep only required part of scripts * update config schema * fix json * set fileAssociation for mac via config * proper iconName handling * add fileAssociation icon generator * fix file association icons bundle * don't break compatibility * remove mimeType as not supported linux for now * add documentation * adjust config schema * restore formatting * try implement single instance lock with params passing * fix focusing * fix focusing * formatting * use channel buffer for second instance events * handle errors * add comment * remove unused option in file association * wip: linux single instance lock * wip: linux single instance * some experiments with making window active * try to use unminimise * remove unused * try present for window * try present for window * fix build * cleanup * cleanup * implement single instance lock on mac os * implement proper show for windows * proper unmimimise * get rid of openFiles mac os. change configuration structure * remove unused channel * remove unused function * add documentation for single instance lock * add PR link * changes after review * update docs * changes after review --------- Co-authored-by: Lea Anthony <lea.anthony@gmail.com>
76 lines
1.6 KiB
Go
76 lines
1.6 KiB
Go
//go:build darwin
|
||
// +build darwin
|
||
|
||
package darwin
|
||
|
||
/*
|
||
#cgo CFLAGS: -x objective-c
|
||
#cgo LDFLAGS: -framework Foundation -framework Cocoa
|
||
#import "AppDelegate.h"
|
||
|
||
*/
|
||
import "C"
|
||
import (
|
||
"encoding/json"
|
||
"github.com/wailsapp/wails/v2/pkg/options"
|
||
"os"
|
||
"syscall"
|
||
)
|
||
|
||
func SetupSingleInstance(uniqueID string) {
|
||
lockFilePath := os.TempDir()
|
||
lockFileName := uniqueID + ".lock"
|
||
_, err := createLockFile(lockFilePath + "/" + lockFileName)
|
||
|
||
// if lockFile exist – send notification to second instance
|
||
if err != nil {
|
||
c := NewCalloc()
|
||
defer c.Free()
|
||
singleInstanceUniqueId := c.String(uniqueID)
|
||
|
||
data, err := options.NewSecondInstanceData()
|
||
if err != nil {
|
||
return
|
||
}
|
||
|
||
serialized, err := json.Marshal(data)
|
||
if err != nil {
|
||
return
|
||
}
|
||
|
||
C.SendDataToFirstInstance(singleInstanceUniqueId, c.String(string(serialized)))
|
||
|
||
os.Exit(0)
|
||
}
|
||
}
|
||
|
||
//export HandleSecondInstanceData
|
||
func HandleSecondInstanceData(secondInstanceMessage *C.char) {
|
||
message := C.GoString(secondInstanceMessage)
|
||
|
||
var secondInstanceData options.SecondInstanceData
|
||
|
||
err := json.Unmarshal([]byte(message), &secondInstanceData)
|
||
if err == nil {
|
||
secondInstanceBuffer <- secondInstanceData
|
||
}
|
||
}
|
||
|
||
// CreateLockFile tries to create a file with given name and acquire an
|
||
// exclusive lock on it. If the file already exists AND is still locked, it will
|
||
// fail.
|
||
func createLockFile(filename string) (*os.File, error) {
|
||
file, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE, 0600)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
err = syscall.Flock(int(file.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
|
||
if err != nil {
|
||
file.Close()
|
||
return nil, err
|
||
}
|
||
|
||
return file, nil
|
||
}
|