Release 3.8.2.6: perceived-speed UX — search, tray hide, core warm, SSE.
Server search/hotkeys; Windows close-to-tray; background EnsureCore; SSE status with rare poll fallback. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -74,9 +74,11 @@ func main() {
|
||||
trayhost.Start("Navis", trayhost.Hooks{
|
||||
Connect: func() { _ = a.Connect() },
|
||||
Disconnect: func() { _ = a.Disconnect() },
|
||||
Show: showMainWindow,
|
||||
Quit: func() {
|
||||
_ = a.Disconnect()
|
||||
os.Exit(0)
|
||||
a.Shutdown()
|
||||
closeMainWindow()
|
||||
},
|
||||
IsUp: func() bool { return a.Mgr.Status().Connected },
|
||||
})
|
||||
@@ -98,6 +100,7 @@ func main() {
|
||||
_ = srv.Close()
|
||||
return
|
||||
}
|
||||
a.OnQuit = closeMainWindow
|
||||
defer func() {
|
||||
a.Shutdown()
|
||||
_ = mgr.Disconnect()
|
||||
|
||||
@@ -31,3 +31,11 @@ func decorateWindow(w glaze.WebView) {
|
||||
// macOS Dock/app icon comes from the .app bundle; nothing to apply here.
|
||||
_ = w
|
||||
}
|
||||
|
||||
func showMainWindow() {}
|
||||
|
||||
func prepareWindowQuit() {}
|
||||
|
||||
func closeMainWindow() {
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
@@ -7,12 +7,38 @@ import (
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sync/atomic"
|
||||
"unsafe"
|
||||
|
||||
"github.com/crgimenes/glaze"
|
||||
"golang.org/x/sys/windows"
|
||||
)
|
||||
|
||||
var (
|
||||
user32 = windows.NewLazySystemDLL("user32.dll")
|
||||
procGetWindowLongPtr = user32.NewProc("GetWindowLongPtrW")
|
||||
procSetWindowLongPtr = user32.NewProc("SetWindowLongPtrW")
|
||||
procCallWindowProc = user32.NewProc("CallWindowProcW")
|
||||
procShowWindow = user32.NewProc("ShowWindow")
|
||||
procSetForeground = user32.NewProc("SetForegroundWindow")
|
||||
procPostMessage = user32.NewProc("PostMessageW")
|
||||
procIsIconic = user32.NewProc("IsIconic")
|
||||
|
||||
mainHWND uintptr
|
||||
origWndProc uintptr
|
||||
closeHookCB uintptr
|
||||
allowDestroy atomic.Bool
|
||||
)
|
||||
|
||||
const (
|
||||
// GWLP_WNDPROC as unsigned pointer-sized -4.
|
||||
gwlpWndProc = ^uintptr(3)
|
||||
wmClose = 0x0010
|
||||
swHide = 0
|
||||
swShow = 5
|
||||
swRestore = 9
|
||||
)
|
||||
|
||||
func openExternal(raw string) error {
|
||||
verb, err := windows.UTF16PtrFromString("open")
|
||||
if err != nil {
|
||||
@@ -40,7 +66,61 @@ func decorateWindow(w glaze.WebView) {
|
||||
if w == nil {
|
||||
return
|
||||
}
|
||||
applyWindowIcon(w.Window())
|
||||
hwnd := w.Window()
|
||||
applyWindowIcon(hwnd)
|
||||
installCloseToHide(hwnd)
|
||||
}
|
||||
|
||||
func installCloseToHide(hwnd unsafe.Pointer) {
|
||||
if hwnd == nil {
|
||||
return
|
||||
}
|
||||
mainHWND = uintptr(hwnd)
|
||||
allowDestroy.Store(false)
|
||||
if closeHookCB == 0 {
|
||||
closeHookCB = windows.NewCallback(closeToHideWndProc)
|
||||
}
|
||||
orig, _, _ := procGetWindowLongPtr.Call(mainHWND, gwlpWndProc)
|
||||
if orig == 0 {
|
||||
return
|
||||
}
|
||||
origWndProc = orig
|
||||
procSetWindowLongPtr.Call(mainHWND, gwlpWndProc, closeHookCB)
|
||||
}
|
||||
|
||||
func closeToHideWndProc(hwnd uintptr, msg uint32, wParam, lParam uintptr) uintptr {
|
||||
if msg == wmClose && !allowDestroy.Load() {
|
||||
procShowWindow.Call(hwnd, uintptr(swHide))
|
||||
return 0
|
||||
}
|
||||
r, _, _ := procCallWindowProc.Call(origWndProc, hwnd, uintptr(msg), wParam, lParam)
|
||||
return r
|
||||
}
|
||||
|
||||
func showMainWindow() {
|
||||
if mainHWND == 0 {
|
||||
return
|
||||
}
|
||||
iconic, _, _ := procIsIconic.Call(mainHWND)
|
||||
if iconic != 0 {
|
||||
procShowWindow.Call(mainHWND, uintptr(swRestore))
|
||||
} else {
|
||||
procShowWindow.Call(mainHWND, uintptr(swShow))
|
||||
}
|
||||
procSetForeground.Call(mainHWND)
|
||||
}
|
||||
|
||||
func prepareWindowQuit() {
|
||||
allowDestroy.Store(true)
|
||||
}
|
||||
|
||||
func closeMainWindow() {
|
||||
prepareWindowQuit()
|
||||
if mainHWND == 0 {
|
||||
os.Exit(0)
|
||||
return
|
||||
}
|
||||
procPostMessage.Call(mainHWND, uintptr(wmClose), 0, 0)
|
||||
}
|
||||
|
||||
func applyWindowIcon(hwnd unsafe.Pointer) {
|
||||
@@ -52,7 +132,6 @@ func applyWindowIcon(hwnd unsafe.Pointer) {
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
user32 := windows.NewLazySystemDLL("user32.dll")
|
||||
loadImage := user32.NewProc("LoadImageW")
|
||||
sendMessage := user32.NewProc("SendMessageW")
|
||||
const (
|
||||
|
||||
Reference in New Issue
Block a user