From 25785766cceaf7119a64759f1a630f57b4d86138 Mon Sep 17 00:00:00 2001 From: meizhigang Date: Thu, 24 Aug 2023 20:02:04 +0800 Subject: [PATCH] fix(display):Fix multi screen auto display while switch style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 适配切换模式自适应多屏显示 Related #13176 --- ...multi-screen-auto-display-while-swit.patch | 161 ++++++++++++++++++ kiran-cc-daemon.spec | 6 +- 2 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 0001-fix-display-Fix-multi-screen-auto-display-while-swit.patch diff --git a/0001-fix-display-Fix-multi-screen-auto-display-while-swit.patch b/0001-fix-display-Fix-multi-screen-auto-display-while-swit.patch new file mode 100644 index 0000000..2507853 --- /dev/null +++ b/0001-fix-display-Fix-multi-screen-auto-display-while-swit.patch @@ -0,0 +1,161 @@ +From eb3e27fd1977a58f04da4907ed563aad09875df3 Mon Sep 17 00:00:00 2001 +From: meizhigang +Date: Thu, 24 Aug 2023 16:34:58 +0800 +Subject: [PATCH] fix(display):Fix multi screen auto display while switch style +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + + - 适配切换模式自适应多屏显示 + + Related #13176 +--- + .../com.kylinsec.kiran.display.gschema.xml.in | 5 ++++ + include/display-i.h | 2 -- + plugins/display/display-manager.cpp | 28 +++++++++++++++++-- + plugins/display/display-manager.h | 2 ++ + plugins/display/display.xsd | 1 + + 5 files changed, 34 insertions(+), 4 deletions(-) + +diff --git a/data/schemas/com.kylinsec.kiran.display.gschema.xml.in b/data/schemas/com.kylinsec.kiran.display.gschema.xml.in +index 7c4930f..9df78d7 100644 +--- a/data/schemas/com.kylinsec.kiran.display.gschema.xml.in ++++ b/data/schemas/com.kylinsec.kiran.display.gschema.xml.in +@@ -24,5 +24,10 @@ + Set whether to adapt to screen changes + + ++ ++ 100 ++ Set max screen record number while save config. ++ ++ + + +diff --git a/include/display-i.h b/include/display-i.h +index 4b0701e..e3bcb97 100644 +--- a/include/display-i.h ++++ b/include/display-i.h +@@ -35,8 +35,6 @@ extern "C" + #define DISPLAY_OBJECT_PATH "/com/kylinsec/Kiran/SessionDaemon/Display" + #define DISPLAY_DBUS_INTERFACE_NAME "com.kylinsec.Kiran.SessionDaemon.Display" + +-#define DISPLAY_SCHEMA_DYNAMIC_SCALING_WINDOW "dynamic-scaling-window" +- + // 显示模式,只有在下列情况会使用显示模式进行设置: + // 1. 程序第一次启动 + // 2. 有连接设备删除和添加时 +diff --git a/plugins/display/display-manager.cpp b/plugins/display/display-manager.cpp +index 7450187..10a4b61 100644 +--- a/plugins/display/display-manager.cpp ++++ b/plugins/display/display-manager.cpp +@@ -26,6 +26,8 @@ namespace Kiran + { + #define DISPLAY_SCHEMA_ID "com.kylinsec.kiran.display" + #define DISPLAY_SCHEMA_STYLE "display-style" ++#define DISPLAY_SCHEMA_DYNAMIC_SCALING_WINDOW "dynamic-scaling-window" ++#define DISPLAY_SCHEMA_MAX_SCREEN_RECORD_NUMBER "max-screen-record-number" + #define SCREEN_CHANGED_ADAPT "screen-changed-adaptation" + + #define DISPLAY_CONF_DIR "kylinsec/" PROJECT_NAME "/display" +@@ -34,10 +36,13 @@ namespace Kiran + #define MONITOR_JOIN_CHAR "," + #define XRANDR_CMD "xrandr" + ++#define DEFAULT_MAX_SCREEN_RECORD_NUMBER 100 ++ + DisplayManager::DisplayManager(XrandrManager *xrandr_manager) : xrandr_manager_(xrandr_manager), + default_style_(DisplayStyle::DISPLAY_STYLE_EXTEND), + window_scaling_factor_(0), + dynamic_scaling_window_(false), ++ max_screen_record_number_(DEFAULT_MAX_SCREEN_RECORD_NUMBER), + dbus_connect_id_(0), + object_register_id_(0) + { +@@ -276,6 +281,7 @@ void DisplayManager::load_settings() + this->default_style_ = DisplayStyle(this->display_settings_->get_enum(DISPLAY_SCHEMA_STYLE)); + this->dynamic_scaling_window_ = this->display_settings_->get_boolean(DISPLAY_SCHEMA_DYNAMIC_SCALING_WINDOW); + this->window_scaling_factor_ = this->xsettings_settings_->get_int(XSETTINGS_SCHEMA_WINDOW_SCALING_FACTOR); ++ this->max_screen_record_number_ = this->display_settings_->get_int(DISPLAY_SCHEMA_MAX_SCREEN_RECORD_NUMBER); + } + + void DisplayManager::load_monitors() +@@ -465,6 +471,7 @@ bool DisplayManager::apply_screen_config(const ScreenConfigInfo &screen_config, + + void DisplayManager::fill_screen_config(ScreenConfigInfo &screen_config) + { ++ screen_config.timestamp((uint32_t)time(NULL)); + screen_config.primary(this->primary_); + screen_config.window_scaling_factor(this->window_scaling_factor_); + +@@ -523,7 +530,7 @@ bool DisplayManager::save_config(CCErrorCode &error_code) + auto monitors_uid = this->get_monitors_uid(); + auto &c_screens = this->display_config_->screen(); + bool matched = false; +- ScreenConfigInfo used_config("", 0); ++ ScreenConfigInfo used_config(0, "", 0); + + this->fill_screen_config(used_config); + for (auto &c_screen : c_screens) +@@ -543,6 +550,23 @@ bool DisplayManager::save_config(CCErrorCode &error_code) + this->display_config_->screen().push_back(used_config); + } + ++ if (c_screens.size() > this->max_screen_record_number_) ++ { ++ auto oldest_screen = c_screens.begin(); ++ for (auto iter = c_screens.begin(); iter != c_screens.end(); iter++) ++ { ++ if ((*iter).timestamp() < (*oldest_screen).timestamp()) ++ { ++ oldest_screen = iter; ++ } ++ } ++ ++ if (oldest_screen != c_screens.end()) ++ { ++ c_screens.erase(oldest_screen); ++ } ++ } ++ + RETURN_VAL_IF_FALSE(this->save_to_file(error_code), false); + + return true; +@@ -770,8 +794,8 @@ void DisplayManager::switch_to_auto() + KLOG_PROFILE(""); + + CCErrorCode error_code; ++ + RETURN_IF_TRUE(this->switch_to_custom(error_code)); +- RETURN_IF_TRUE(this->switch_to_mirrors(error_code)); + this->switch_to_extend(); + } + +diff --git a/plugins/display/display-manager.h b/plugins/display/display-manager.h +index 3d866ff..5fbf741 100644 +--- a/plugins/display/display-manager.h ++++ b/plugins/display/display-manager.h +@@ -145,6 +145,8 @@ private: + int32_t window_scaling_factor_; + // 开启动态缩放窗口 + bool dynamic_scaling_window_; ++ // 可存储屏幕个数最大值 ++ uint32_t max_screen_record_number_; + + std::map> monitors_; + +diff --git a/plugins/display/display.xsd b/plugins/display/display.xsd +index c39f85e..521ec7f 100644 +--- a/plugins/display/display.xsd ++++ b/plugins/display/display.xsd +@@ -38,6 +38,7 @@ + + + ++ + + + +-- +2.27.0 + diff --git a/kiran-cc-daemon.spec b/kiran-cc-daemon.spec index 2b9b7a9..e0ac938 100644 --- a/kiran-cc-daemon.spec +++ b/kiran-cc-daemon.spec @@ -1,6 +1,6 @@ Name: kiran-cc-daemon Version: 2.5.1 -Release: 23 +Release: 24 Summary: DBus daemon for Kiran Desktop License: MulanPSL-2.0 @@ -27,6 +27,7 @@ Patch0018: 0001-fix-keybindings-Remove-power-and-logout-invalid-key-.patch Patch0019: 0001-fix-power-Change-poweroff-action-from-key-press-to-r.patch Patch0020: 0001-feature-font-Change-the-default-GTK-application-font.patch Patch0021: 0001-fix-power-Fix-related-project-build-with-power-event.patch +Patch0022: 0001-fix-display-Fix-multi-screen-auto-display-while-swit.patch BuildRequires: cmake >= 3.2 BuildRequires: pkgconfig(glibmm-2.4) @@ -196,6 +197,9 @@ glib-compile-schemas /usr/share/glib-2.0/schemas &> /dev/nulls || : %{_libdir}/pkgconfig/kiran-cc-daemon.pc %changelog +* Thu Aug 24 2023 meizhigang - 2.5.1-24 +- KYOS-B: Fix multi screen auto display while switch style (#13176) + * Wed Aug 23 2023 meizhigang - 2.5.1-23 - KYOS-B: Fix related project build with power event param (#11422) -- Gitee