mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-03 06:01:52 +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>
70 lines
1.6 KiB
Go
70 lines
1.6 KiB
Go
//go:build linux
|
|
// +build linux
|
|
|
|
package linux
|
|
|
|
import (
|
|
"encoding/json"
|
|
"github.com/godbus/dbus/v5"
|
|
"github.com/wailsapp/wails/v2/pkg/options"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
type dbusHandler func(string)
|
|
|
|
func (f dbusHandler) SendMessage(message string) *dbus.Error {
|
|
f(message)
|
|
return nil
|
|
}
|
|
|
|
func SetupSingleInstance(uniqueID string) {
|
|
id := "wails_app_" + strings.ReplaceAll(strings.ReplaceAll(uniqueID, "-", "_"), ".", "_")
|
|
|
|
dbusName := "org." + id + ".SingleInstance"
|
|
dbusPath := "/org/" + id + "/SingleInstance"
|
|
|
|
conn, err := dbus.ConnectSessionBus()
|
|
// if we will reach any error during establishing connection or sending message we will just continue.
|
|
// It should not be the case that such thing will happen actually, but just in case.
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
f := dbusHandler(func(message string) {
|
|
var secondInstanceData options.SecondInstanceData
|
|
|
|
err := json.Unmarshal([]byte(message), &secondInstanceData)
|
|
if err == nil {
|
|
secondInstanceBuffer <- secondInstanceData
|
|
}
|
|
})
|
|
|
|
err = conn.Export(f, dbus.ObjectPath(dbusPath), dbusName)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
reply, err := conn.RequestName(dbusName, dbus.NameFlagDoNotQueue)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
// if name already taken, try to send args to existing instance, if no success just launch new instance
|
|
if reply == dbus.RequestNameReplyExists {
|
|
data := options.SecondInstanceData{
|
|
Args: os.Args[1:],
|
|
}
|
|
serialized, err := json.Marshal(data)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
err = conn.Object(dbusName, dbus.ObjectPath(dbusPath)).Call(dbusName+".SendMessage", 0, string(serialized)).Store()
|
|
if err != nil {
|
|
return
|
|
}
|
|
os.Exit(1)
|
|
}
|
|
}
|