From a805d00e2915c2c8a8d1726eb767c0f9406ed748 Mon Sep 17 00:00:00 2001 From: Adam Shiervani Date: Wed, 29 Oct 2025 16:11:07 +0100 Subject: [PATCH 1/2] fix: video quality (#913) --- config.go | 32 +++++++++++++++++++++++++++++--- internal/native/cgo/ctrl.c | 6 +++--- internal/native/cgo/video.c | 2 +- internal/native/native.go | 2 +- jsonrpc.go | 9 +++++---- 5 files changed, 39 insertions(+), 12 deletions(-) diff --git a/config.go b/config.go index 080cfd471..786fe9496 100644 --- a/config.go +++ b/config.go @@ -161,9 +161,35 @@ var defaultConfig = &Config{ RelativeMouse: true, Keyboard: true, MassStorage: true, - }, - NetworkConfig: &network.NetworkConfig{}, - DefaultLogLevel: "INFO", + } +) + +func getDefaultConfig() Config { + return Config{ + CloudURL: "https://api.jetkvm.com", + CloudAppURL: "https://app.jetkvm.com", + AutoUpdateEnabled: true, // Set a default value + ActiveExtension: "", + KeyboardMacros: []KeyboardMacro{}, + DisplayRotation: "270", + KeyboardLayout: "en-US", + DisplayMaxBrightness: 64, + DisplayDimAfterSec: 120, // 2 minutes + DisplayOffAfterSec: 1800, // 30 minutes + JigglerEnabled: false, + // This is the "Standard" jiggler option in the UI + JigglerConfig: func() *JigglerConfig { c := defaultJigglerConfig; return &c }(), + TLSMode: "", + UsbConfig: func() *usbgadget.Config { c := defaultUsbConfig; return &c }(), + UsbDevices: func() *usbgadget.Devices { c := defaultUsbDevices; return &c }(), + NetworkConfig: func() *types.NetworkConfig { + c := &types.NetworkConfig{} + _ = confparser.SetDefaultsAndValidate(c) + return c + }(), + DefaultLogLevel: "INFO", + VideoQualityFactor: 1.0, + } } var ( diff --git a/internal/native/cgo/ctrl.c b/internal/native/cgo/ctrl.c index 0c10ee15a..547d5694b 100644 --- a/internal/native/cgo/ctrl.c +++ b/internal/native/cgo/ctrl.c @@ -306,7 +306,7 @@ int jetkvm_ui_add_flag(const char *obj_name, const char *flag_name) { if (obj == NULL) { return -1; } - + lv_obj_flag_t flag_val = str_to_lv_obj_flag(flag_name); if (flag_val == 0) { @@ -368,7 +368,7 @@ void jetkvm_video_stop() { } int jetkvm_video_set_quality_factor(float quality_factor) { - if (quality_factor < 0 || quality_factor > 1) { + if (quality_factor <= 0 || quality_factor > 1) { return -1; } video_set_quality_factor(quality_factor); @@ -417,4 +417,4 @@ void jetkvm_crash() { // let's call a function that will crash the program int* p = 0; *p = 0; -} \ No newline at end of file +} diff --git a/internal/native/cgo/video.c b/internal/native/cgo/video.c index 917e91637..857acbbb9 100644 --- a/internal/native/cgo/video.c +++ b/internal/native/cgo/video.c @@ -235,7 +235,7 @@ int video_init(float factor) { detect_sleep_mode(); - if (factor < 0 || factor > 1) { + if (factor <= 0 || factor > 1) { factor = 1.0f; } quality_factor = factor; diff --git a/internal/native/native.go b/internal/native/native.go index 0a7732466..cb8761cf1 100644 --- a/internal/native/native.go +++ b/internal/native/native.go @@ -71,7 +71,7 @@ func NewNative(opts NativeOptions) *Native { sleepModeSupported := isSleepModeSupported() defaultQualityFactor := opts.DefaultQualityFactor - if defaultQualityFactor < 0 || defaultQualityFactor > 1 { + if defaultQualityFactor <= 0 || defaultQualityFactor > 1 { defaultQualityFactor = 1.0 } diff --git a/jsonrpc.go b/jsonrpc.go index ea6c6fba5..939442023 100644 --- a/jsonrpc.go +++ b/jsonrpc.go @@ -199,10 +199,8 @@ func rpcReboot(force bool) error { return nil } -var streamFactor = 1.0 - func rpcGetStreamQualityFactor() (float64, error) { - return streamFactor, nil + return config.VideoQualityFactor, nil } func rpcSetStreamQualityFactor(factor float64) error { @@ -212,7 +210,10 @@ func rpcSetStreamQualityFactor(factor float64) error { return err } - streamFactor = factor + config.VideoQualityFactor = factor + if err := SaveConfig(); err != nil { + return fmt.Errorf("failed to save config: %w", err) + } return nil } From 0e6956f1a7ea00c56377a07b8607e212ec9f15ca Mon Sep 17 00:00:00 2001 From: Siyuan Date: Fri, 14 Nov 2025 13:28:34 +0000 Subject: [PATCH 2/2] fix: git merge conflict --- config.go | 47 ++++++++++++++++++----------------------------- jsonrpc.go | 3 ++- 2 files changed, 20 insertions(+), 30 deletions(-) diff --git a/config.go b/config.go index 786fe9496..9049d9802 100644 --- a/config.go +++ b/config.go @@ -7,6 +7,7 @@ import ( "strconv" "sync" + "github.com/jetkvm/kvm/internal/confparser" "github.com/jetkvm/kvm/internal/logging" "github.com/jetkvm/kvm/internal/network" "github.com/jetkvm/kvm/internal/usbgadget" @@ -129,34 +130,23 @@ func (c *Config) SetDisplayRotation(rotation string) error { const configPath = "/userdata/kvm_config.json" -var defaultConfig = &Config{ - CloudURL: "https://api.jetkvm.com", - CloudAppURL: "https://app.jetkvm.com", - AutoUpdateEnabled: true, // Set a default value - ActiveExtension: "", - KeyboardMacros: []KeyboardMacro{}, - DisplayRotation: "270", - KeyboardLayout: "en-US", - DisplayMaxBrightness: 64, - DisplayDimAfterSec: 120, // 2 minutes - DisplayOffAfterSec: 1800, // 30 minutes - JigglerEnabled: false, - // This is the "Standard" jiggler option in the UI - JigglerConfig: &JigglerConfig{ +// it's a temporary solution to avoid sharing the same pointer +// we should migrate to a proper config solution in the future +var ( + defaultJigglerConfig = JigglerConfig{ InactivityLimitSeconds: 60, JitterPercentage: 25, ScheduleCronTab: "0 * * * * *", Timezone: "UTC", - }, - TLSMode: "", - UsbConfig: &usbgadget.Config{ + } + defaultUsbConfig = usbgadget.Config{ VendorId: "0x1d6b", //The Linux Foundation ProductId: "0x0104", //Multifunction Composite Gadget SerialNumber: "", Manufacturer: "JetKVM", Product: "USB Emulation Device", - }, - UsbDevices: &usbgadget.Devices{ + } + defaultUsbDevices = usbgadget.Devices{ AbsoluteMouse: true, RelativeMouse: true, Keyboard: true, @@ -182,8 +172,8 @@ func getDefaultConfig() Config { TLSMode: "", UsbConfig: func() *usbgadget.Config { c := defaultUsbConfig; return &c }(), UsbDevices: func() *usbgadget.Devices { c := defaultUsbDevices; return &c }(), - NetworkConfig: func() *types.NetworkConfig { - c := &types.NetworkConfig{} + NetworkConfig: func() *network.NetworkConfig { + c := &network.NetworkConfig{} _ = confparser.SetDefaultsAndValidate(c) return c }(), @@ -222,7 +212,8 @@ func LoadConfig() { } // load the default config - config = defaultConfig + defaultConfig := getDefaultConfig() + config = &defaultConfig file, err := os.Open(configPath) if err != nil { @@ -234,7 +225,7 @@ func LoadConfig() { defer file.Close() // load and merge the default config with the user config - loadedConfig := *defaultConfig + loadedConfig := getDefaultConfig() if err := json.NewDecoder(file).Decode(&loadedConfig); err != nil { logger.Warn().Err(err).Msg("config file JSON parsing failed") configSuccess.Set(0.0) @@ -243,19 +234,19 @@ func LoadConfig() { // merge the user config with the default config if loadedConfig.UsbConfig == nil { - loadedConfig.UsbConfig = defaultConfig.UsbConfig + loadedConfig.UsbConfig = getDefaultConfig().UsbConfig } if loadedConfig.UsbDevices == nil { - loadedConfig.UsbDevices = defaultConfig.UsbDevices + loadedConfig.UsbDevices = getDefaultConfig().UsbDevices } if loadedConfig.NetworkConfig == nil { - loadedConfig.NetworkConfig = defaultConfig.NetworkConfig + loadedConfig.NetworkConfig = getDefaultConfig().NetworkConfig } if loadedConfig.JigglerConfig == nil { - loadedConfig.JigglerConfig = defaultConfig.JigglerConfig + loadedConfig.JigglerConfig = getDefaultConfig().JigglerConfig } // fixup old keyboard layout value @@ -263,8 +254,6 @@ func LoadConfig() { loadedConfig.KeyboardLayout = "en-US" } - config = &loadedConfig - logging.GetRootLogger().UpdateLogLevel(config.DefaultLogLevel) configSuccess.Set(1.0) diff --git a/jsonrpc.go b/jsonrpc.go index 939442023..9459329f4 100644 --- a/jsonrpc.go +++ b/jsonrpc.go @@ -720,7 +720,8 @@ func rpcSetWakeOnLanDevices(params SetWakeOnLanDevicesParams) error { } func rpcResetConfig() error { - config = defaultConfig + defaultConfig := getDefaultConfig() + config = &defaultConfig if err := SaveConfig(); err != nil { return fmt.Errorf("failed to reset config: %w", err) }