Ariver
2026-07-12 24f551a39eae849d891da26cc91f90d354e3a2db
C1.source/privatevoice.src/internal/config/config.go
@@ -3,12 +3,16 @@
import (
   "encoding/json"
   "os"
   "runtime"
   "voicesnap/internal/logger"
   "voicesnap/internal/model"
   "voicesnap/internal/paths"
)
const (
   UnsetHotkeyVK            = 0
   LegacyDefaultHotkeyVK    = 0xA5
   RightModifierDefaultVK   = 0x5C
   HotkeyModeTap            = "tap"
   HotkeyModeHold           = "hold"
   LanguageModeAuto         = "auto"
@@ -25,6 +29,7 @@
   SoundFeedback            bool   `json:"SoundFeedback"`
   HideDockIcon             bool   `json:"HideDockIcon"`
   CopyToClipboard          bool   `json:"CopyToClipboard"`
   AutoPasteExperiment      bool   `json:"AutoPasteExperiment"`
   DeviceName               string `json:"DeviceName,omitempty"`
   IndicatorX               int    `json:"IndicatorX,omitempty"`
   IndicatorY               int    `json:"IndicatorY,omitempty"`
@@ -38,13 +43,28 @@
// Default returns a default configuration.
func Default() *Config {
   return defaultWithHotkey(defaultHotkeyVKForNewConfig(runtime.GOOS))
}
func legacyDefaultForExistingConfig() *Config {
   return defaultWithHotkey(LegacyDefaultHotkeyVK)
}
// ExistingConfigFallback returns a legacy-safe fallback for cases where a
// config file exists but cannot be read or parsed.
func ExistingConfigFallback() *Config {
   return legacyDefaultForExistingConfig()
}
func defaultWithHotkey(hotkeyVK int) *Config {
   return &Config{
      HotkeyVK:                 0xA5, // Right Alt
      HotkeyVK:                 hotkeyVK,
      HotkeyMode:               HotkeyModeHold,
      AutoHide:                 true,
      SoundFeedback:            true,
      HideDockIcon:             true,
      CopyToClipboard:          true,
      AutoPasteExperiment:      false,
      SelectedModelID:          model.DefaultModelID,
      ModelSelectionMode:       ModelSelectionModeAuto,
      LanguageMode:             LanguageModeAuto,
@@ -52,6 +72,22 @@
      ModelDownloadUrl:         "http://www.maikami.com/voicesnap/sensevoice.zip",
      FallbackModelDownloadUrl: "https://modelscope.cn/models/sherpa-onnx/sherpa-onnx-sense-voice-zh-en-ja-ko-yue/resolve/master/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-int8-2024-07-17.tar.bz2",
   }
}
func defaultHotkeyVKForNewConfig(goos string) int {
   if defaultHotkeyUnsetForNewConfig(goos) {
      return UnsetHotkeyVK
   }
   switch goos {
   case "darwin", "windows":
      return RightModifierDefaultVK
   default:
      return LegacyDefaultHotkeyVK
   }
}
func IsHotkeyUnset(vk int) bool {
   return vk == UnsetHotkeyVK
}
func configPath() string {
@@ -71,7 +107,7 @@
      return nil, err
   }
   cfg := Default()
   cfg := legacyDefaultForExistingConfig()
   if err := json.Unmarshal(data, cfg); err != nil {
      return nil, err
   }