diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index b069fcee1..eb22d4cc4 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -1282,6 +1282,15 @@ bool mainGetBoolOptionSync(String key) { return option2bool(key, bind.mainGetOptionSync(key: key)); } +mainSetLocalBoolOption(String key, bool value) async { + String v = bool2option(key, value); + await bind.mainSetLocalOption(key: key, value: v); +} + +bool mainGetLocalBoolOptionSync(String key) { + return option2bool(key, bind.mainGetLocalOption(key: key)); +} + Future matchPeer(String searchText, Peer peer) async { if (searchText.isEmpty) { return true; diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index 81cd2af7d..b3dc960d8 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -314,19 +314,16 @@ class _GeneralState extends State<_General> { Widget other() { final children = [ _OptionCheckBox(context, 'Confirm before closing multiple tabs', - 'enable-confirm-closing-tabs'), + 'enable-confirm-closing-tabs', + isServer: false), _OptionCheckBox(context, 'Adaptive Bitrate', 'enable-abr') ]; - if (Platform.isLinux) { - children.add(Tooltip( - message: translate('software_render_tip'), - child: _OptionCheckBox( - context, - "Always use software rendering", - 'allow-always-software-render', - ), - )); - } + // though this is related to GUI, but opengl problem affects all users, so put in config rather than local + children.add(Tooltip( + message: translate('software_render_tip'), + child: _OptionCheckBox(context, "Always use software rendering", + 'allow-always-software-render'), + )); if (bind.mainShowOption(key: 'allow-linux-headless')) { children.add(_OptionCheckBox( context, 'Allow linux headless', 'allow-linux-headless')); @@ -1666,15 +1663,22 @@ Widget _OptionCheckBox(BuildContext context, String label, String key, bool reverse = false, bool enabled = true, Icon? checkedIcon, - bool? fakeValue}) { - bool value = mainGetBoolOptionSync(key); + bool? fakeValue, + bool isServer = true}) { + bool value = + isServer ? mainGetBoolOptionSync(key) : mainGetLocalBoolOptionSync(key); if (reverse) value = !value; var ref = value.obs; onChanged(option) async { if (option != null) { if (reverse) option = !option; - await mainSetBoolOption(key, option); - ref.value = mainGetBoolOptionSync(key); + isServer + ? await mainSetBoolOption(key, option) + : await mainSetLocalBoolOption(key, option); + ref.value = isServer + ? mainGetBoolOptionSync(key) + : mainGetLocalBoolOptionSync(key); + ; update?.call(); } } diff --git a/flutter/lib/desktop/pages/file_manager_tab_page.dart b/flutter/lib/desktop/pages/file_manager_tab_page.dart index f994e461c..c011fe48d 100644 --- a/flutter/lib/desktop/pages/file_manager_tab_page.dart +++ b/flutter/lib/desktop/pages/file_manager_tab_page.dart @@ -129,7 +129,7 @@ class _FileManagerTabPageState extends State { } else { final opt = "enable-confirm-closing-tabs"; final bool res; - if (!option2bool(opt, await bind.mainGetOption(key: opt))) { + if (!option2bool(opt, await bind.mainGetLocalOption(key: opt))) { res = true; } else { res = await closeConfirmDialog(); diff --git a/flutter/lib/desktop/pages/remote_tab_page.dart b/flutter/lib/desktop/pages/remote_tab_page.dart index 9ee04f8b1..af6e00f4a 100644 --- a/flutter/lib/desktop/pages/remote_tab_page.dart +++ b/flutter/lib/desktop/pages/remote_tab_page.dart @@ -360,7 +360,7 @@ class _ConnectionTabPageState extends State { } else { final opt = "enable-confirm-closing-tabs"; final bool res; - if (!option2bool(opt, await bind.mainGetOption(key: opt))) { + if (!option2bool(opt, await bind.mainGetLocalOption(key: opt))) { res = true; } else { res = await closeConfirmDialog(); diff --git a/flutter/lib/desktop/pages/server_page.dart b/flutter/lib/desktop/pages/server_page.dart index f1e35364c..c22935f09 100644 --- a/flutter/lib/desktop/pages/server_page.dart +++ b/flutter/lib/desktop/pages/server_page.dart @@ -254,7 +254,7 @@ class ConnectionManagerState extends State { } else { final opt = "enable-confirm-closing-tabs"; final bool res; - if (!option2bool(opt, await bind.mainGetOption(key: opt))) { + if (!option2bool(opt, await bind.mainGetLocalOption(key: opt))) { res = true; } else { res = await closeConfirmDialog(); diff --git a/flutter/lib/desktop/widgets/tabbar_widget.dart b/flutter/lib/desktop/widgets/tabbar_widget.dart index bc7864e45..adafaf0aa 100644 --- a/flutter/lib/desktop/widgets/tabbar_widget.dart +++ b/flutter/lib/desktop/widgets/tabbar_widget.dart @@ -701,7 +701,7 @@ Future closeConfirmDialog() async { submit() { final opt = "enable-confirm-closing-tabs"; String value = bool2option(opt, confirm); - bind.mainSetOption(key: opt, value: value); + bind.mainSetLocalOption(key: opt, value: value); close(true); } diff --git a/flutter/lib/models/ab_model.dart b/flutter/lib/models/ab_model.dart index 8ae320a52..d3104a611 100644 --- a/flutter/lib/models/ab_model.dart +++ b/flutter/lib/models/ab_model.dart @@ -139,7 +139,8 @@ class AbModel { "data": jsonEncode({"tags": tags, "peers": peersJsonData}) }); var request = http.Request('POST', Uri.parse(api)); - if (licensedDevices > 0) { + // support compression + if (licensedDevices > 0 && body.length > 1024) { authHeaders['Content-Encoding'] = "gzip"; request.bodyBytes = GZipCodec().encode(utf8.encode(body)); } else { diff --git a/libs/hbb_common/src/platform/mod.rs b/libs/hbb_common/src/platform/mod.rs index 78cf61e97..5dc004a81 100644 --- a/libs/hbb_common/src/platform/mod.rs +++ b/libs/hbb_common/src/platform/mod.rs @@ -31,6 +31,7 @@ extern "C" fn breakdown_signal_handler(sig: i32) { s.contains(&"nouveau_pushbuf_kick") || s.to_lowercase().contains("nvidia") || s.contains("gdk_window_end_draw_frame") + || s.contains("glGetString") }) { Config::set_option("allow-always-software-render".to_string(), "Y".to_string()); info = "Always use software rendering will be set.".to_string();