Files
2026-07-13 13:00:08 +08:00

88 lines
2.1 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package main
import (
"encoding/json"
"os"
"os/exec"
"path/filepath"
"reasonix/internal/config"
)
// DesktopZoomFactor persists the user's WebView2 zoom factor preference across
// restarts. The frontend writes it; main.go reads it before wails.Run() to set
// the Windows ZoomFactor option.
type DesktopZoomFactor struct {
ZoomFactor float64 `json:"zoomFactor"`
}
func zoomFactorPath() string {
return filepath.Join(config.MemoryUserDir(), "desktop-zoom.json")
}
// loadZoomFactor reads the saved zoom factor. The bool is false when no saved
// value exists (first launch, missing file, corrupt JSON). Callers should fall
// back to 1.0 (no zoom) in that case.
func loadZoomFactor() (float64, bool) {
path := zoomFactorPath()
data, err := readFileUTF8(path)
if err != nil {
return 0, false
}
var zf DesktopZoomFactor
if err := json.Unmarshal(data, &zf); err != nil {
return 0, false
}
if zf.ZoomFactor < 0.5 || zf.ZoomFactor > 2.0 {
return 0, false
}
return zf.ZoomFactor, true
}
// GetDesktopZoomFactor returns the currently persisted restart zoom factor,
// or 1.0 if none is saved.
func (a *App) GetDesktopZoomFactor() float64 {
zf, ok := loadZoomFactor()
if !ok {
return 1.0
}
return zf
}
// SetDesktopZoomFactor persists a zoom factor for the next launch. The value
// is clamped to [0.5, 2.0] (50% 200%) for safety.
func (a *App) SetDesktopZoomFactor(factor float64) error {
if factor < 0.5 {
factor = 0.5
}
if factor > 2.0 {
factor = 2.0
}
path := zoomFactorPath()
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
return err
}
data, err := json.Marshal(DesktopZoomFactor{ZoomFactor: factor})
if err != nil {
return err
}
return os.WriteFile(path, data, 0o644)
}
// RestartApplication saves the zoom and restarts the whole process so the new
// ZoomFactor takes effect in the WebView2 window options.
func (a *App) RestartApplication() error {
exe, err := os.Executable()
if err != nil {
return err
}
cmd := exec.Command(exe, os.Args[1:]...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Start(); err != nil {
return err
}
os.Exit(0)
return nil
}