mirror of
https://github.com/stashapp/stash.git
synced 2025-12-13 11:52:46 +01:00
* Rename manager.instance to Manager * Show dialog message on fatal error on Windows * Hide console windows explicitly on icon launch Gets rid of the windowsgui flag, which causes all sorts of issues. Instead, checks if stash was launched from the icon, and if so hides the console. * Remove fixconsole * Add changelog entries
88 lines
2.1 KiB
Go
88 lines
2.1 KiB
Go
//go:build windows
|
|
// +build windows
|
|
|
|
package desktop
|
|
|
|
import (
|
|
"os/exec"
|
|
"syscall"
|
|
"unsafe"
|
|
|
|
"github.com/go-toast/toast"
|
|
"github.com/stashapp/stash/pkg/logger"
|
|
"golang.org/x/sys/windows/svc"
|
|
)
|
|
|
|
var (
|
|
kernel32 = syscall.NewLazyDLL("kernel32.dll")
|
|
user32 = syscall.NewLazyDLL("user32.dll")
|
|
)
|
|
|
|
func isService() bool {
|
|
result, err := svc.IsWindowsService()
|
|
if err != nil {
|
|
logger.Errorf("Encountered error checking if running as Windows service: %s", err.Error())
|
|
return false
|
|
}
|
|
return result
|
|
}
|
|
|
|
// Detect if windows golang executable file is running via double click or from cmd/shell terminator
|
|
// https://stackoverflow.com/questions/8610489/distinguish-if-program-runs-by-clicking-on-the-icon-typing-its-name-in-the-cons?rq=1
|
|
// https://github.com/shirou/w32/blob/master/kernel32.go
|
|
// https://github.com/kbinani/win/blob/master/kernel32.go#L3268
|
|
// win.GetConsoleProcessList(new(uint32), win.DWORD(2))
|
|
// from https://gist.github.com/yougg/213250cc04a52e2b853590b06f49d865
|
|
func isDoubleClickLaunched() bool {
|
|
lp := kernel32.NewProc("GetConsoleProcessList")
|
|
if lp != nil {
|
|
var pids [2]uint32
|
|
var maxCount uint32 = 2
|
|
ret, _, _ := lp.Call(uintptr(unsafe.Pointer(&pids)), uintptr(maxCount))
|
|
if ret > 1 {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func hideConsole() {
|
|
const SW_HIDE = 0
|
|
h := getConsoleWindow()
|
|
lp := user32.NewProc("ShowWindow")
|
|
|
|
// don't want to check for errors and can't prevent dogsled
|
|
_, _, _ = lp.Call(h, SW_HIDE) //nolint:dogsled
|
|
}
|
|
|
|
func getConsoleWindow() uintptr {
|
|
lp := kernel32.NewProc("GetConsoleWindow")
|
|
ret, _, _ := lp.Call()
|
|
return ret
|
|
}
|
|
|
|
func isServerDockerized() bool {
|
|
return false
|
|
}
|
|
|
|
func sendNotification(notificationTitle string, notificationText string) {
|
|
notification := toast.Notification{
|
|
AppID: "Stash",
|
|
Title: notificationTitle,
|
|
Message: notificationText,
|
|
Icon: getIconPath(),
|
|
Actions: []toast.Action{{
|
|
Type: "protocol",
|
|
Label: "Open Stash",
|
|
Arguments: getServerURL(""),
|
|
}},
|
|
}
|
|
err := notification.Push()
|
|
if err != nil {
|
|
logger.Errorf("Error creating Windows notification: %s", err.Error())
|
|
}
|
|
}
|
|
|
|
func revealInFileManager(path string) {
|
|
exec.Command(`explorer`, `\select`, path)
|
|
}
|