diff --git a/.github/workflows/backup-to-gitlab.yml b/.github/workflows/backup-to-gitlab.yml index c1763359..9863040f 100644 --- a/.github/workflows/backup-to-gitlab.yml +++ b/.github/workflows/backup-to-gitlab.yml @@ -8,10 +8,8 @@ concurrency: jobs: backup-to-gitlabwh: uses: linuxdeepin/.github/.github/workflows/backup-to-gitlabwh.yml@master - secrets: - BRIDGETOKEN: ${{ secrets.BRIDGETOKEN }} + secrets: inherit backup-to-gitee: uses: linuxdeepin/.github/.github/workflows/backup-to-gitee.yml@master - secrets: - GITEE_SYNC_TOKEN: ${{ secrets.GITEE_SYNC_TOKEN }} + secrets: inherit diff --git a/.github/workflows/call-build-deb.yml b/.github/workflows/call-build-deb.yml deleted file mode 100644 index fd67cbec..00000000 --- a/.github/workflows/call-build-deb.yml +++ /dev/null @@ -1,17 +0,0 @@ -name: Call build-deb -on: - pull_request_target: - paths-ignore: - - ".github/workflows/**" - types: [ opened, closed, synchronize ] - -concurrency: - group: ${{ github.workflow }}-pull/${{ github.event.number }} - cancel-in-progress: true - -jobs: - check_job: - if: github.event.action != 'closed' || github.event.pull_request.merged - uses: linuxdeepin/.github/.github/workflows/build-deb.yml@master - secrets: - BridgeToken: ${{ secrets.BridgeToken }} diff --git a/.github/workflows/call-chatOps.yml b/.github/workflows/call-chatOps.yml index 0eb0b7bc..18c76bc3 100644 --- a/.github/workflows/call-chatOps.yml +++ b/.github/workflows/call-chatOps.yml @@ -6,5 +6,4 @@ on: jobs: chatopt: uses: linuxdeepin/.github/.github/workflows/chatOps.yml@master - secrets: - APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }} + secrets: inherit diff --git a/.github/workflows/cppcheck.yml b/.github/workflows/cppcheck.yml index 6a92b546..e808a89b 100644 --- a/.github/workflows/cppcheck.yml +++ b/.github/workflows/cppcheck.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - run: export - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.sha }} persist-credentials: false diff --git a/.obs/workflows.yml b/.obs/workflows.yml new file mode 100644 index 00000000..8c18fe03 --- /dev/null +++ b/.obs/workflows.yml @@ -0,0 +1,43 @@ +test_build: + steps: + - link_package: + source_project: deepin:Develop:dde + source_package: %{SCM_REPOSITORY_NAME} + target_project: deepin:CI + + - configure_repositories: + project: deepin:CI + repositories: + - name: deepin_develop + paths: + - target_project: deepin:CI + target_repository: deepin_develop + architectures: + - x86_64 + - aarch64 + + - name: debian + paths: + - target_project: deepin:CI + target_repository: debian_sid + architectures: + - x86_64 + + filters: + event: pull_request + +tag_build: + steps: + - trigger_services: + project: deepin:Unstable:dde + package: %{SCM_REPOSITORY_NAME} + filters: + event: tag_push + +commit_build: + steps: + - trigger_services: + project: deepin:Develop:dde + package: %{SCM_REPOSITORY_NAME} + filters: + event: push diff --git a/.reuse/dep5 b/.reuse/dep5 index 6d00cf9d..4cd3d22b 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -4,7 +4,7 @@ Upstream-Contact: UnionTech Software Technology Co., Ltd. <> Source: https://github.com/linuxdeepin/deepin-system-monitor # ci -Files: .github/* +Files: .github/* .obs/workflows.yml Copyright: None License: CC0-1.0 @@ -18,6 +18,11 @@ Files: *.toml *.json *conf *.yaml *.sh *.xml *.pc.in Copyright: None License: CC0-1.0 +# assets +Files: assets/* +Copyright: UnionTech Software Technology Co., Ltd. +License: GPL-3.0-or-later + # debian Files: debian/* Copyright: None @@ -44,7 +49,7 @@ Copyright: UnionTech Software Technology Co., Ltd. License: LGPL-3.0-or-later # translations -Files: deepin-system-monitor-main/translations/* deepin-system-monitor-plugin/translations/* deepin-system-monitor-plugin-popup/translations/* +Files: deepin-system-monitor-main/translations/* deepin-system-monitor-plugin/translations/* deepin-system-monitor-plugin-popup/translations/* deepin-system-monitor-system-server/translations/* Copyright: UnionTech Software Technology Co., Ltd. License: LGPL-3.0-or-later @@ -148,6 +153,11 @@ Files: deepin-system-monitor-plugin-popup/system/* Copyright: UnionTech Software Technology Co., Ltd. License: GPL-3.0-or-later +# deepin-system-monitor-system-server +Files: deepin-system-monitor-system-server/misc/* +Copyright: UnionTech Software Technology Co., Ltd. +License: GPL-3.0-or-later + # *.service Files: *.service Copyright: UnionTech Software Technology Co., Ltd. diff --git a/.tx/config b/.tx/config index 2e0fba61..dab45d77 100644 --- a/.tx/config +++ b/.tx/config @@ -3,19 +3,19 @@ host = https://www.transifex.com minimum_perc = 80 mode = developer -[deepin-system-monitor.deepin-system-monitor] +[o:linuxdeepin:p:deepin-system-monitor:r:deepin-system-monitor] file_filter = deepin-system-monitor-main/translations/deepin-system-monitor_.ts source_file = deepin-system-monitor-main/translations/deepin-system-monitor.ts source_lang = en_US type = QT -[deepin-system-monitor.deepin-system-monitor-desktop] +[o:linuxdeepin:p:deepin-system-monitor:r:deepin-system-monitor-desktop] file_filter = deepin-system-monitor-main/translations/desktop/desktop_.ts source_file = deepin-system-monitor-main/translations/desktop/desktop.ts source_lang = en_US type = QT -[deepin-system-monitor.deepin-system-monitor-policy] +[o:linuxdeepin:p:deepin-system-monitor:r:deepin-system-monitor-policy] file_filter = deepin-system-monitor-main/translations/policy/policy_.ts source_file = deepin-system-monitor-main/translations/policy/policy.ts preTranlate_file = deepin-system-monitor-main/translations/policy/policy.policy @@ -23,16 +23,23 @@ source_lang = en_US type = QT #popup -[deepin-system-monitor.deepin-system-monitor-plugin-popup] +[o:linuxdeepin:p:deepin-system-monitor:r:deepin-system-monitor-plugin-popup] file_filter = deepin-system-monitor-plugin-popup/translations/deepin-system-monitor-plugin-popup_.ts source_file = deepin-system-monitor-plugin-popup/translations/deepin-system-monitor-plugin-popup.ts source_lang = en_US type = QT #plugin -[deepin-system-monitor.deepin-system-monitor-plugin] +[o:linuxdeepin:p:deepin-system-monitor:r:deepin-system-monitor-plugin] file_filter = deepin-system-monitor-plugin/translations/deepin-system-monitor-plugin_.ts source_file = deepin-system-monitor-plugin/translations/deepin-system-monitor-plugin.ts source_lang = en_US type = QT +#system-server +[o:linuxdeepin:p:deepin-system-monitor:r:deepin-system-monitor-system-server-policy] +file_filter = deepin-system-monitor-system-server/translations/policy/policy_.ts +source_file = deepin-system-monitor-system-server/translations/policy/policy.ts +preTranlate_file = deepin-system-monitor-system-server/misc/com.deepin.deepin-system-monitor-system-server.policy +source_lang = en_US +type = QT diff --git a/.tx/deepin.conf b/.tx/deepin.conf index 45cd054c..c230b4f8 100644 --- a/.tx/deepin.conf +++ b/.tx/deepin.conf @@ -1,2 +1,2 @@ [transifex] -branch = m20 \ No newline at end of file +branch = m20 diff --git a/CMakeLists.txt b/CMakeLists.txt index 35915fd1..857a172a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,9 +50,41 @@ ADD_SUBDIRECTORY(deepin-system-monitor-plugin-popup) ADD_SUBDIRECTORY(deepin-system-monitor-daemon) #系统监视器提示 ADD_SUBDIRECTORY(deepin-system-monitor-server) +#系统监视器后端提权处理服务 +ADD_SUBDIRECTORY(deepin-system-monitor-system-server) + #单元测试 if(DOTEST) ADD_SUBDIRECTORY(tests) endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/config.h) + +#安装日志收集工具配置 +set(journel_system_monitor_main assets/logconfig/org.deepin.system-monitor.json) +install(FILES ${journel_system_monitor_main} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/deepin-log-viewer/deepin-log.conf.d/) + +#安装DConfig配置 +set(APPID org.deepin.system-monitor) +set(system_monitor_main assets/configs/org.deepin.system-monitor.json) +set(system_monitor_daemon assets/configs/org.deepin.system-monitor.daemon.json) +set(system_monitor_plugin assets/configs/org.deepin.system-monitor.plugin.json) +set(system_monitor_plugin_popup assets/configs/org.deepin.system-monitor.plugin.popup.json) +set(system_monitor_plugin_server assets/configs/org.deepin.system-monitor.server.json) + +if (DEFINED DSG_DATA_DIR) + dconfig_meta_files(APPID ${APPID} FILES ${system_monitor_main}) + dconfig_meta_files(APPID ${APPID} FILES ${system_monitor_daemon}) + dconfig_meta_files(APPID ${APPID} FILES ${system_monitor_plugin}) + dconfig_meta_files(APPID ${APPID} FILES ${system_monitor_plugin_popup}) + dconfig_meta_files(APPID ${APPID} FILES ${system_monitor_plugin_server}) + message("-- DConfig is supported by DTK") +else() + install(FILES ${system_monitor_main} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/dsg/configs/${APPID}/) + install(FILES ${system_monitor_daemon} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/dsg/configs/${APPID}/) + install(FILES ${system_monitor_plugin} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/dsg/configs/${APPID}/) + install(FILES ${system_monitor_plugin_popup} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/dsg/configs/${APPID}/) + install(FILES ${system_monitor_plugin_server} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/dsg/configs/${APPID}/) + + message("-- DConfig is not supported by DTK") +endif() diff --git a/README.md b/README.md index b82b18ec..fcd5a95d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Thanks a lot for [Lily Rivers](https://github.com/VioletDarkKitty/system-monito ## Dependencies -* sudo apt install libpcap-dev libncurses5-dev libprocps-dev libxtst-dev libxcb-util0-dev +* sudo apt install libpcap-dev libncurses5-dev libxtst-dev libxcb-util0-dev ## Installation diff --git a/README.zh_CN.md b/README.zh_CN.md index 0414eaa0..2eab6aa4 100644 --- a/README.zh_CN.md +++ b/README.zh_CN.md @@ -6,7 +6,7 @@ Thanks a lot for [Lily Rivers](https://github.com/VioletDarkKitty/system-monito ## 依赖关系 -* sudo apt install libpcap-dev libncurses5-dev libprocps-dev libxtst-dev libxcb-util0-dev +* sudo apt install libpcap-dev libncurses5-dev libxtst-dev libxcb-util0-dev ## 安装 diff --git a/assets/configs/org.deepin.system-monitor.daemon.json b/assets/configs/org.deepin.system-monitor.daemon.json new file mode 100644 index 00000000..a95c790d --- /dev/null +++ b/assets/configs/org.deepin.system-monitor.daemon.json @@ -0,0 +1,19 @@ +{ + "magic": "dsg.config.meta", + "version": "1.0", + "contents": { + "log_rules": { + "value": "*.debug=false;*.info=false;*.warning=true", + "serial": 0, + "flags": [ + "global" + ], + "name": "log rules", + "name[zh_CN]": "日志规则", + "description": "log rules", + "description[zh_CN]": "日志规则", + "permissions": "readwrite", + "visibility": "public" + } + } +} diff --git a/assets/configs/org.deepin.system-monitor.json b/assets/configs/org.deepin.system-monitor.json new file mode 100644 index 00000000..a95c790d --- /dev/null +++ b/assets/configs/org.deepin.system-monitor.json @@ -0,0 +1,19 @@ +{ + "magic": "dsg.config.meta", + "version": "1.0", + "contents": { + "log_rules": { + "value": "*.debug=false;*.info=false;*.warning=true", + "serial": 0, + "flags": [ + "global" + ], + "name": "log rules", + "name[zh_CN]": "日志规则", + "description": "log rules", + "description[zh_CN]": "日志规则", + "permissions": "readwrite", + "visibility": "public" + } + } +} diff --git a/assets/configs/org.deepin.system-monitor.plugin.json b/assets/configs/org.deepin.system-monitor.plugin.json new file mode 100644 index 00000000..a95c790d --- /dev/null +++ b/assets/configs/org.deepin.system-monitor.plugin.json @@ -0,0 +1,19 @@ +{ + "magic": "dsg.config.meta", + "version": "1.0", + "contents": { + "log_rules": { + "value": "*.debug=false;*.info=false;*.warning=true", + "serial": 0, + "flags": [ + "global" + ], + "name": "log rules", + "name[zh_CN]": "日志规则", + "description": "log rules", + "description[zh_CN]": "日志规则", + "permissions": "readwrite", + "visibility": "public" + } + } +} diff --git a/assets/configs/org.deepin.system-monitor.plugin.popup.json b/assets/configs/org.deepin.system-monitor.plugin.popup.json new file mode 100644 index 00000000..a95c790d --- /dev/null +++ b/assets/configs/org.deepin.system-monitor.plugin.popup.json @@ -0,0 +1,19 @@ +{ + "magic": "dsg.config.meta", + "version": "1.0", + "contents": { + "log_rules": { + "value": "*.debug=false;*.info=false;*.warning=true", + "serial": 0, + "flags": [ + "global" + ], + "name": "log rules", + "name[zh_CN]": "日志规则", + "description": "log rules", + "description[zh_CN]": "日志规则", + "permissions": "readwrite", + "visibility": "public" + } + } +} diff --git a/assets/configs/org.deepin.system-monitor.server.json b/assets/configs/org.deepin.system-monitor.server.json new file mode 100644 index 00000000..a95c790d --- /dev/null +++ b/assets/configs/org.deepin.system-monitor.server.json @@ -0,0 +1,19 @@ +{ + "magic": "dsg.config.meta", + "version": "1.0", + "contents": { + "log_rules": { + "value": "*.debug=false;*.info=false;*.warning=true", + "serial": 0, + "flags": [ + "global" + ], + "name": "log rules", + "name[zh_CN]": "日志规则", + "description": "log rules", + "description[zh_CN]": "日志规则", + "permissions": "readwrite", + "visibility": "public" + } + } +} diff --git a/assets/logconfig/org.deepin.system-monitor.json b/assets/logconfig/org.deepin.system-monitor.json new file mode 100644 index 00000000..29aaad15 --- /dev/null +++ b/assets/logconfig/org.deepin.system-monitor.json @@ -0,0 +1,29 @@ +{ + "name": "deepin-system-monitor", + "group": "", + "submodules": [ + { + "name": "deepin-system-monitor", + "filter": "", + "exec": "/usr/bin/deepin-system-monitor", + "logType": "journal", + "logPath": "" + }, + { + "name": "deepin-system-monitor-plugin-popup", + "filter": "", + "exec": "/usr/bin/deepin-system-monitor-plugin-popup", + "logType": "journal", + "logPath": "" + }, + { + "name": "deepin-system-monitor-server", + "filter": "", + "exec": "/usr/bin/deepin-system-monitor-server", + "logType": "journal", + "logPath": "" + } + ], + "visible": true, + "version": "V1.0" +} diff --git a/debian/changelog b/debian/changelog index abdbe331..eeec5eb8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,56 +1,156 @@ -deepin-system-monitor (5.10.5) unstable; urgency=medium +deepin-system-monitor (6.0.22) unstable; urgency=medium - * New version 5.10.5 + * New version 6.0.22. - -- shuaijie Thu, 15 Aug 2023 15:01:00 +0800 + -- shuaijie Mon, 15 Jul 2024 14:45:00 +0800 -deepin-system-monitor (5.10.4) unstable; urgency=medium +deepin-system-monitor (6.0.21) unstable; urgency=medium - * New version 5.10.4. + * New version 6.0.21. - -- muyuankai Wed, 26 Jul 2023 17:03:23 +0800 + -- shuaijie Wed, 10 Jul 2024 14:41:00 +0800 -deepin-system-monitor (5.10.3) unstable; urgency=medium +deepin-system-monitor (6.0.20) unstable; urgency=medium - * New version 5.10.3 + * New version 6.0.20. - -- shuaijie Wed, 19 Jul 2023 11:01:00 +0800 + -- shuaijie Thu, 26 Jun 2024 16:18:12 +0800 -deepin-system-monitor (5.10.2) unstable; urgency=medium +deepin-system-monitor (6.0.19) unstable; urgency=medium - * New version 5.10.2 + * New version 6.0.19. - -- shuaijie Fri, 16 Jun 2023 13:25:06 +0800 + -- shuaijie Tue, 30 Apr 2024 10:44:12 +0800 -deepin-system-monitor (5.10.1) unstable; urgency=medium +deepin-system-monitor (6.0.18) unstable; urgency=medium - * New version 5.10.1 + * feat: Block the system monitor plugin.(Task: 30767) - -- shuaijie Mon, 5 Jun 2023 16:35:01 +0800 + -- renbin Wed, 10 Apr 2024 15:56:41 +0800 -deepin-system-monitor (5.9.37) unstable; urgency=medium +deepin-system-monitor (6.0.17) unstable; urgency=medium - * Graded control 5.9.37. + * fix: delay in reading system information in the plug-in (#325) + * chore: Adapt blurEffectWidget with inner and outer borders + * feat: Adapt taskbar icon activation status (#327) (Task: 331683) - -- muyuankai Thu, 25 May 2023 13:15:02 +0800 + -- renbin Wed, 27 Mar 2024 15:23:42 +0800 -deepin-system-monitor (5.9.36) unstable; urgency=medium +deepin-system-monitor (6.0.16) unstable; urgency=medium - * Graded control. + * New version 6.0.16. - -- muyuankai Wed, 17 May 2023 11:23:01 +0800 + -- shuaijie Thu, 13 Mar 2024 14:50:06 +0800 -deepin-system-monitor (5.9.34) unstable; urgency=medium +deepin-system-monitor (6.0.15) unstable; urgency=medium - * New version 5.9.34 + * New version 6.0.15. - -- wangyu Thu, 13 Apr 2023 15:16:33 +0800 + -- shuaijie Fri, 01 Mar 2024 15:55:47 +0800 -deepin-system-monitor (5.9.33) unstable; urgency=medium +deepin-system-monitor (6.0.14) unstable; urgency=medium - * New version 5.9.33 + * New version 6.0.14. - -- wangyu Fri, 07 Apr 2023 10:06:56 +0800 + -- fengli Tue, 27 Feb 2024 15:55:47 +0800 + +deepin-system-monitor (6.0.13) unstable; urgency=medium + + * fix some bugs. + + -- fengli Wed, 21 Feb 2024 17:01:03 +0800 + +deepin-system-monitor (6.0.12) unstable; urgency=medium + + * fix: Adapt getWindowStates() interface(Bug: 235483) + + -- houchengqiu Wed, 17 Jan 2024 13:46:55 +0800 + +deepin-system-monitor (6.0.11) unstable; urgency=medium + + * feat: replace the plugin icon with the system icon + * feat: adapt to new models + + -- fengli Wed, 10 Jan 2024 11:47:17 +0800 + +deepin-system-monitor (6.0.10) unstable; urgency=medium + + * fix: The first time the system monitor display is set up in the control center taskbar, it needs to be clicked twice before the system monitor icon will be displayed in the taskbar + + -- fengli Fri, 22 Dec 2023 15:20:59 +0800 + +deepin-system-monitor (6.0.9) unstable; urgency=medium + + * new version. + + -- shuaijie Thu, 14 Nov 2023 10:08:10 +0800 + +deepin-system-monitor (6.0.8) unstable; urgency=medium + + * feat: 改造系统监视器服务 + * fix: 资源占用达到报警阈值时未弹出消息通知(Bug: 194991) + * fix: dde接口适配 + * fix: 修复传输文件时,系统监视器不显示传速度(Bug: 163561) + * fix: 修复1060末启动server + * feat: 新增pgw判断 + * chore: Sync by https://github.com/linuxdeepin/.github/commit/559e91167d4919644f37bbcf123eb0651c1528ea(Influence: none) + * fix: 修复在dde-dock中右键菜单系统监视器图标无法激活系统监视器窗口到顶层(Bug: 191373) + * feat: hw机型判断适配dconfig(Task: 276433) + * feat: hw机型判断适配dconfig(Task: 276433) + * fix: 系统监视器占用资源过高优化 + * feat: merge branch chinalife + * feat: 优化底层数据读取 + * fix: 插件功能回退 + * fix: V20、V23接口兼容 + * fix: 修改为通过QtDBus调用dde接口并兼容V20与V23接口变化 + * fix: 火狐浏览器进程的磁盘写入速率达到8EB/s(Bug: 212249) + * fix: Can't pack v23 in obs + * fix: deepin-system-monitor crashed(Issue: https://github.com/linuxdeepin/developer-center/issues/5592) + * fix: 判断dde-dock版本,区分V23与V20插件实现 + + -- YeShanShan Mon, 11 Sep 2023 15:48:23 +0800 + +deepin-system-monitor (6.0.7) unstable; urgency=medium + + * new version. + + -- shuaijie Fri, 12 May 2023 11:19:12 +0800 + +deepin-system-monitor (6.0.6) unstable; urgency=medium + + * New version 6.0.6 + + -- wangyu Mon, 13 Mar 2023 15:41:21 +0800 + +deepin-system-monitor (6.0.5) unstable; urgency=medium + + *update version + + -- liuzheng Tue, 07 Feb 2023 15:24:57 +0800 + +deepin-system-monitor (6.0.4) unstable; urgency=medium + + * update version + + -- liuzheng Mon, 16 Jan 2023 17:28:19 +0800 + +deepin-system-monitor (6.0.3) unstable; urgency=medium + + * New version 6.0.3 + + -- wangyu Fri, 6 Jan 2023 10:52:18 +0800 + +deepin-system-monitor (6.0.2) unstable; urgency=medium + + * New version 6.0.2 + + -- wangyu Tue, 6 Dec 2022 11:22:18 +0800 + +deepin-system-monitor (6.0.1) unstable; urgency=medium + + * New version 6.0.1 + + -- wangyu Wed, 9 Nov 2022 10:03:18 +0800 deepin-system-monitor (1.0.0) unstable; urgency=medium diff --git a/debian/control b/debian/control index e13e044d..ab380c91 100644 --- a/debian/control +++ b/debian/control @@ -2,13 +2,43 @@ Source: deepin-system-monitor Section: utils Priority: optional Maintainer: Deepin Packages Builder -Build-Depends: debhelper (>= 11), cmake, pkg-config, qtbase5-dev, qttools5-dev, libdtkwidget-dev, libxcb1-dev, libqt5x11extras5-dev, libprocps-dev, libxext-dev, libpcap-dev, qttools5-dev-tools, libicu-dev, deepin-gettext-tools, libxcb-util0-dev, libxcb-icccm4-dev, libnl-3-dev, libnl-route-3-dev, libudev-dev, libdframeworkdbus-dev, libgsettings-qt-dev, dde-dock-dev, libgtest-dev, libgmock-dev, libkf5wayland-dev, libwayland-dev +Build-Depends: + debhelper (>= 11), + cmake, + pkg-config, + qtbase5-dev, + qttools5-dev, + libdtkwidget-dev, + libxcb1-dev, + libqt5x11extras5-dev, + libxext-dev, + libpcap-dev, + qttools5-dev-tools, + libicu-dev, + deepin-gettext-tools, + libxcb-util0-dev, + libxcb-icccm4-dev, + libnl-3-dev, + libnl-route-3-dev, + libudev-dev, + libgsettings-qt-dev, + dde-dock-dev, + libgtest-dev, + libgmock-dev, + libdwayland-dev | libkf5wayland-dev, + libwayland-dev, + libpolkit-qt5-1-dev Standards-Version: 3.9.8 Homepage: https://github.com/linuxdeepin/deepin-system-monitor Package: deepin-system-monitor Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, libcap2-bin, libkf5waylandclient5, libkf5waylandserver5, deepin-service-manager +Depends: ${shlibs:Depends}, + ${misc:Depends}, + libcap2-bin, + libdwaylandclient5 | libkf5waylandclient5, + libdwaylandserver5 | libkf5waylandserver5, + deepin-service-manager Recommends: uos-reporter, deepin-event-log Replaces: deepin-system-monitor-plugin Description: A system monitor tool. diff --git a/debian/postinst b/debian/postinst index 338222d6..f704125c 100644 --- a/debian/postinst +++ b/debian/postinst @@ -2,8 +2,8 @@ set -e if [ "$1" = configure ]; then - if command -v setcap > /dev/null; then - if setcap cap_net_raw,cap_dac_read_search,cap_sys_ptrace+ep /usr/bin/deepin-system-monitor;then + if command -v setcap >/dev/null; then + if setcap cap_net_raw,cap_dac_read_search+ep /usr/bin/deepin-system-monitor; then chmod u-s /usr/bin/deepin-system-monitor else echo "Setcap failed, falling back to setuid" >&2 @@ -12,7 +12,14 @@ if [ "$1" = configure ]; then else echo "Setcap is not installed, falling back to setuid" >&2 chmod u+s /usr/bin/deepin-system-monitor - fi + fi +fi + +# Restart service +if [ "$1" = "configure" ]; then + if [ -d /run/systemd/system ]; then + deb-systemd-invoke restart 'deepin-service-manager.service' >/dev/null || true + fi fi exit 0 diff --git a/deepin-system-monitor-daemon/src/cpuprofile.cpp b/deepin-system-monitor-daemon/src/cpuprofile.cpp index 7d51ab3c..1512044c 100644 --- a/deepin-system-monitor-daemon/src/cpuprofile.cpp +++ b/deepin-system-monitor-daemon/src/cpuprofile.cpp @@ -1,17 +1,17 @@ // SPDX-FileCopyrightText: 2011 ~ 2023 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later - +#include "ddlog.h" #include "cpuprofile.h" #include #include +using namespace DDLog; #define PROC_CPU_STAT_PATH "/proc/stat" #define PROC_CPU_INFO_PATH "/proc/cpuinfo" CpuProfile::CpuProfile(QObject *parent) - : QObject(parent) - , mCpuUsage(0.0) + : QObject(parent), mCpuUsage(0.0) { // mLastCpuStat用于记录Cpu状态 // 各项数值是开机后各项工作的时间片总数 @@ -47,7 +47,7 @@ double CpuProfile::updateSystemCpuUsage() // |user|nice|sys|idle|iowait|hardqirq|softirq|steal|guest|guest_nice| // 分割行数据 - QStringList cpuStatus = QString(lineData).split(" ", QString::SkipEmptyParts); + QStringList cpuStatus = QString(lineData).split(" ", QString::SkipEmptyParts); // CPU状态应包含10个数据片段,有效数据 1-10,位置0不使用 if (cpuStatus.size() < 11) { @@ -83,7 +83,7 @@ double CpuProfile::updateSystemCpuUsage() (curCpuStat["idle"] + curCpuStat["iowait"]) - (mLastCpuStat["idle"] + mLastCpuStat["iowait"]); if (calcCpuTotal == 0.0) { - qWarning() << " cpu total usage calc result equal 0 ! cpu stat [" << curCpuStat << "]"; + qCWarning(app) << " cpu total usage calc result equal 0 ! cpu stat [" << curCpuStat << "]"; return cpuUsage; } // 上一个时间段内的Cpu使用情况 @@ -95,7 +95,7 @@ double CpuProfile::updateSystemCpuUsage() // 更新上一次CPU状态 mLastCpuStat = curCpuStat; } else { - qWarning() << QString(" file %1 open fail !").arg(PROC_CPU_STAT_PATH); + qCWarning(app) << QString(" file %1 open fail !").arg(PROC_CPU_STAT_PATH); } return cpuUsage; diff --git a/deepin-system-monitor-daemon/src/ddlog.h b/deepin-system-monitor-daemon/src/ddlog.h new file mode 100644 index 00000000..a4b69aef --- /dev/null +++ b/deepin-system-monitor-daemon/src/ddlog.h @@ -0,0 +1,15 @@ +// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#ifndef DDLOG_H +#define DDLOG_H +#include +#include +DCORE_USE_NAMESPACE + +namespace DDLog { +inline Q_LOGGING_CATEGORY(app, "org.deepin.system-monitor.daemon") +} + +#endif // DDLOG_H diff --git a/deepin-system-monitor-daemon/src/logger.cpp b/deepin-system-monitor-daemon/src/logger.cpp new file mode 100644 index 00000000..14f92b0a --- /dev/null +++ b/deepin-system-monitor-daemon/src/logger.cpp @@ -0,0 +1,68 @@ +// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#include "logger.h" +#include "dtkcore_global.h" +#include "qglobal.h" +#include "ddlog.h" +#include +#include + +#include +using namespace DDLog; + +DCORE_USE_NAMESPACE + +MLogger::MLogger(QObject *parent) + : QObject(parent), m_rules(""), m_config(nullptr) +{ + QByteArray logRules = qgetenv("QT_LOGGING_RULES"); + // qunsetenv 之前一定不要有任何日志打印,否则取消环境变量设置不会生效 + qunsetenv("QT_LOGGING_RULES"); + + // set env + m_rules = logRules; + + // set dconfig + m_config = DConfig::create("org.deepin.system-monitor", "org.deepin.system-monitor.daemon"); + logRules = m_config->value("log_rules").toByteArray(); + appendRules(logRules); + setRules(m_rules); + + // watch dconfig + connect(m_config, &DConfig::valueChanged, this, [this](const QString &key) { + qCritical(app) << "value changed:" << key; + if (key == "log_rules") { + setRules(m_config->value(key).toByteArray()); + } + }); +} + +MLogger::~MLogger() +{ + m_config->deleteLater(); +} + +void MLogger::setRules(const QString &rules) +{ + auto tmpRules = rules; + m_rules = tmpRules.replace(";", "\n"); + QLoggingCategory::setFilterRules(m_rules); +} + +void MLogger::appendRules(const QString &rules) +{ + QString tmpRules = rules; + tmpRules = tmpRules.replace(";", "\n"); + auto tmplist = tmpRules.split('\n'); + for (int i = 0; i < tmplist.count(); i++) + if (m_rules.contains(tmplist.at(i))) { + tmplist.removeAt(i); + i--; + } + if (tmplist.isEmpty()) + return; + m_rules.isEmpty() ? m_rules = tmplist.join("\n") + : m_rules += "\n" + tmplist.join("\n"); +} diff --git a/deepin-system-monitor-daemon/src/logger.h b/deepin-system-monitor-daemon/src/logger.h new file mode 100644 index 00000000..946fa7a3 --- /dev/null +++ b/deepin-system-monitor-daemon/src/logger.h @@ -0,0 +1,28 @@ +// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#include +#include + +DCORE_BEGIN_NAMESPACE +class DConfig; +DCORE_END_NAMESPACE + +class MLogger : public QObject +{ + Q_OBJECT +public: + explicit MLogger(QObject *parent = nullptr); + ~MLogger(); + + inline QString rules() const { return m_rules; } + void setRules(const QString &rules); + +private: + void appendRules(const QString &rules); + +private: + QString m_rules; + Dtk::Core::DConfig *m_config; +}; diff --git a/deepin-system-monitor-daemon/src/memoryprofile.cpp b/deepin-system-monitor-daemon/src/memoryprofile.cpp index bc373113..f23aed0d 100644 --- a/deepin-system-monitor-daemon/src/memoryprofile.cpp +++ b/deepin-system-monitor-daemon/src/memoryprofile.cpp @@ -3,15 +3,14 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "memoryprofile.h" - +#include "ddlog.h" #include #include #define PROC_MEM_INFOI_PATH "/proc/meminfo" - +using namespace DDLog; MemoryProfile::MemoryProfile(QObject *parent) - : QObject(parent) - , mMemUsage(0) + : QObject(parent), mMemUsage(0) { } @@ -32,7 +31,7 @@ double MemoryProfile::updateSystemMemoryUsage() // MemFree: 1455488 kB // MemAvailable: 5931304 kB if (lineData1.size() == 0 || lineData2.size() == 0 || lineData3.size() == 0) { - qWarning() << QString(" read %1 file fail !").arg(PROC_MEM_INFOI_PATH) << lineData1 << lineData2 << lineData3; + qCWarning(app) << QString(" read %1 file fail !").arg(PROC_MEM_INFOI_PATH) << lineData1 << lineData2 << lineData3; return memUsage; } @@ -42,7 +41,7 @@ double MemoryProfile::updateSystemMemoryUsage() QStringList list3 = QString(lineData3).split(" ", QString::SkipEmptyParts); if (list1.size() < 3 || list2.size() < 3 || list3.size() < 3) { - qWarning() << QString(" parse %1 file fail !").arg(PROC_MEM_INFOI_PATH) << list1 << list2 << list3; + qCWarning(app) << QString(" parse %1 file fail !").arg(PROC_MEM_INFOI_PATH) << list1 << list2 << list3; return memUsage; } @@ -52,14 +51,14 @@ double MemoryProfile::updateSystemMemoryUsage() memDataMap[list3.at(0)] = list3.at(1).toInt(); // 为返回值赋值,计算内存占用率 - if (memDataMap.contains("MemTotal:") && memDataMap.contains("MemAvailable:") && memDataMap["MemTotal:"] != 0) { + if (memDataMap.contains("MemTotal:") && memDataMap.contains("MemAvailable:") && memDataMap["MemTotal:"] != 0) { memUsage = (memDataMap["MemTotal:"] - memDataMap["MemAvailable:"]) * 100.0 / memDataMap["MemTotal:"]; mMemUsage = memUsage; } else { - qWarning() << QString(" extract mem data fail !") << memDataMap; + qCWarning(app) << QString(" extract mem data fail !") << memDataMap; } } else { - qWarning() << QString(" file %1 open fail !").arg(PROC_MEM_INFOI_PATH); + qCWarning(app) << QString(" file %1 open fail !").arg(PROC_MEM_INFOI_PATH); } return memUsage; @@ -69,4 +68,3 @@ double MemoryProfile::getMemUsage() { return mMemUsage; } - diff --git a/deepin-system-monitor-daemon/src/settinghandler.cpp b/deepin-system-monitor-daemon/src/settinghandler.cpp index c8d2aade..502f1a0c 100644 --- a/deepin-system-monitor-daemon/src/settinghandler.cpp +++ b/deepin-system-monitor-daemon/src/settinghandler.cpp @@ -3,7 +3,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "settinghandler.h" - +#include "ddlog.h" #include #include @@ -13,6 +13,8 @@ #include #include +using namespace DDLog; + // 警报数据,由产品定义 const static int MinAlarmCpuUsage = 30; const static int MaxAlarmCpuUsage = 100; @@ -22,9 +24,7 @@ const static int MinAlarmInterval = 5; const static int MaxAlarmInterval = 60; SettingHandler::SettingHandler(QObject *parent) - : QObject(parent) - , mSettings(nullptr) - , mBackend(nullptr) + : QObject(parent), mSettings(nullptr), mBackend(nullptr) { QString orgName = qApp->organizationName(); if (orgName.isEmpty()) { @@ -33,9 +33,9 @@ SettingHandler::SettingHandler(QObject *parent) //配置文件路径: ~/.config/deepin/deepin-system-monitor/protection.conf QString strConfigPath = QString("%1/%2/%3/protection.conf") - .arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)) - .arg(orgName) - .arg("deepin-system-monitor"); + .arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)) + .arg(orgName) + .arg("deepin-system-monitor"); mBackend = new Dtk::Core::QSettingBackend(strConfigPath); mSettings = DSettings::fromJsonFile(":/resources/settings.json"); @@ -49,7 +49,7 @@ SettingHandler::SettingHandler(QObject *parent) auto keys = mValueRange.keys(); foreach (auto it, keys) { - qDebug() << __FUNCTION__ << __LINE__ << ",key: " << it << ", range: " << mValueRange[it]; + qCDebug(app) << __FUNCTION__ << __LINE__ << ",key: " << it << ", range: " << mValueRange[it]; } if (mSettings != nullptr) { @@ -78,7 +78,7 @@ QVariant SettingHandler::getOptionValue(const QString key) if (isCompelted() && mSettings->keys().contains(key)) { return mSettings->getOption(key); } else { - qWarning() << __FUNCTION__ << __LINE__ << QString("can not find conf[%1]!").arg(key) + qCWarning(app) << __FUNCTION__ << __LINE__ << QString("can not find conf[%1]!").arg(key) << ", compeletd:" << isCompelted() << ", avalid keys:" << mSettings->keys(); } @@ -94,7 +94,7 @@ bool SettingHandler::changedOptionValue(const QString key, const QVariant value) mSettings->sync(); return true; } else { - qWarning() << __FUNCTION__ << __LINE__ << QString("change conf[%1,%2] fail !").arg(key).arg(value.toString()) + qCWarning(app) << __FUNCTION__ << __LINE__ << QString("change conf[%1,%2] fail !").arg(key).arg(value.toString()) << ", compeletd:" << isCompelted() << ", avalid keys:" << mSettings->keys(); } @@ -122,7 +122,7 @@ QPair SettingHandler::getValueRange(const QString key) if (mValueRange.contains(key)) { range = mValueRange[key]; } - return range; + return range; } QList SettingHandler::itemKeys() diff --git a/deepin-system-monitor-daemon/src/systemmonitorservice.cpp b/deepin-system-monitor-daemon/src/systemmonitorservice.cpp index 44a8db54..9aeefe93 100644 --- a/deepin-system-monitor-daemon/src/systemmonitorservice.cpp +++ b/deepin-system-monitor-daemon/src/systemmonitorservice.cpp @@ -3,7 +3,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "systemmonitorservice.h" - +#include "ddlog.h" #include #include @@ -14,16 +14,21 @@ #include #include +using namespace DDLog; + // 打印DBus调用者信息 -#define PrintDBusCaller() { \ - if(calledFromDBus()) { \ - QDBusConnection conn = connection(); \ - QDBusMessage msg = message(); \ - pid_t callerPid = static_cast(conn.interface()->servicePid(msg.service()).value()); \ - qDebug() << "DBus service caller:" << conn.interface()->serviceOwner(msg.service()).value() \ - << ",Uid:" << conn.interface()->serviceUid(msg.service()).value() \ - << ",Pid:" << callerPid \ - << ",Process name:" << getNameByPid(callerPid); } } +#define PrintDBusCaller() \ + { \ + if (calledFromDBus()) { \ + QDBusConnection conn = connection(); \ + QDBusMessage msg = message(); \ + pid_t callerPid = static_cast(conn.interface()->servicePid(msg.service()).value()); \ + qCDebug(app) << "DBus service caller:" << conn.interface()->serviceOwner(msg.service()).value() \ + << ",Uid:" << conn.interface()->serviceUid(msg.service()).value() \ + << ",Pid:" << callerPid \ + << ",Process name:" << getNameByPid(callerPid); \ + } \ + } // 通过PID获取进程名称 QString getNameByPid(pid_t pid) @@ -45,18 +50,12 @@ QString getNameByPid(pid_t pid) #define AlarmMessageTimeOut 10000 SystemMonitorService::SystemMonitorService(const char *name, QObject *parent) - : QObject(parent) - , mProtectionStatus(InitAlarmOn) - , mAlarmInterval(InitAlarmInterval) - , mAlarmCpuUsage(InitAlarmCpuUsage) - , mAlarmMemoryUsage(InitAlarmMemUsage) - , mCpuUsage(0) - , mMemoryUsage(0) - , mMoniterTimer(this) -// , mLastAlarmTimeStamp(0) - , mSettings(this) - , mCpu(this) - , mMem(this) + : QObject(parent), mProtectionStatus(InitAlarmOn), mAlarmInterval(InitAlarmInterval), mAlarmCpuUsage(InitAlarmCpuUsage), mAlarmMemoryUsage(InitAlarmMemUsage), mCpuUsage(0), mMemoryUsage(0), mMoniterTimer(this) + // , mLastAlarmTimeStamp(0) + , + mSettings(this), + mCpu(this), + mMem(this) { if (mSettings.isCompelted()) { mProtectionStatus = mSettings.getOptionValue(AlarmStatusOptionName).toBool(); @@ -64,7 +63,6 @@ SystemMonitorService::SystemMonitorService(const char *name, QObject *parent) mAlarmMemoryUsage = mSettings.getOptionValue(AlarmMemUsageOptionName).toInt(); mAlarmInterval = mSettings.getOptionValue(AlarmIntervalOptionName).toInt(); mLastAlarmTimeStamp = mSettings.getOptionValue(AlarmLastTimeOptionName).toLongLong(); - } // 初始化Cpu占用率 @@ -80,11 +78,10 @@ SystemMonitorService::SystemMonitorService(const char *name, QObject *parent) mMoniterTimer.start(); QDBusConnection::RegisterOptions opts = - QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals | - QDBusConnection::ExportAllProperties; + QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals | QDBusConnection::ExportAllProperties; QDBusConnection::connectToBus(QDBusConnection::SessionBus, QString(name)) - .registerObject("/org/deepin/SystemMonitorDaemon", this, opts); + .registerObject("/org/deepin/SystemMonitorDaemon", this, opts); } SystemMonitorService::~SystemMonitorService() @@ -94,14 +91,16 @@ SystemMonitorService::~SystemMonitorService() bool SystemMonitorService::getSystemProtectionStatus() { PrintDBusCaller() - qDebug() << __FUNCTION__ << __LINE__ << " Get Protection Status:" << mProtectionStatus; + qCDebug(app) + << __FUNCTION__ << __LINE__ << " Get Protection Status:" << mProtectionStatus; return mProtectionStatus; } void SystemMonitorService::setSystemProtectionStatus(bool status) { PrintDBusCaller() - qDebug() << __FUNCTION__ << __LINE__ << " Set Protection Status:" << status; + qCDebug(app) + << __FUNCTION__ << __LINE__ << " Set Protection Status:" << status; if (mProtectionStatus != status) { mProtectionStatus = status; @@ -115,28 +114,32 @@ void SystemMonitorService::setSystemProtectionStatus(bool status) int SystemMonitorService::getCpuUsage() { PrintDBusCaller() - qDebug() << __FUNCTION__ << __LINE__ << " Get Cpu Usage:" << mCpuUsage; + qCDebug(app) + << __FUNCTION__ << __LINE__ << " Get Cpu Usage:" << mCpuUsage; return mCpuUsage; } int SystemMonitorService::getMemoryUsage() { PrintDBusCaller() - qDebug() << __FUNCTION__ << __LINE__ << " Get Memory Usage:" << mMemoryUsage; + qCDebug(app) + << __FUNCTION__ << __LINE__ << " Get Memory Usage:" << mMemoryUsage; return mMemoryUsage; } int SystemMonitorService::getAlarmMsgInterval() { PrintDBusCaller() - qDebug() << __FUNCTION__ << __LINE__ << " Get Alarm Msg Interval:" << mAlarmInterval; + qCDebug(app) + << __FUNCTION__ << __LINE__ << " Get Alarm Msg Interval:" << mAlarmInterval; return mAlarmInterval; } void SystemMonitorService::setAlarmMsgInterval(int interval) { PrintDBusCaller() - qDebug() << __FUNCTION__ << __LINE__ << " Set Alarm Msg Interval:" << interval; + qCDebug(app) + << __FUNCTION__ << __LINE__ << " Set Alarm Msg Interval:" << interval; // 根据需求 if (mSettings.isVaildValue(AlarmIntervalOptionName, interval)) { @@ -154,14 +157,16 @@ void SystemMonitorService::setAlarmMsgInterval(int interval) qint64 SystemMonitorService::getAlaramLastTimeInterval() { PrintDBusCaller() - qDebug() << __FUNCTION__ << __LINE__ << " Get Alarm Last Time:" << mLastAlarmTimeStamp; + qCDebug(app) + << __FUNCTION__ << __LINE__ << " Get Alarm Last Time:" << mLastAlarmTimeStamp; return mLastAlarmTimeStamp; } void SystemMonitorService::setAlaramLastTimeInterval(qint64 lastTime) { PrintDBusCaller() - qDebug() << __FUNCTION__ << __LINE__ << " Set Alarm Last Time:" << lastTime; + qCDebug(app) + << __FUNCTION__ << __LINE__ << " Set Alarm Last Time:" << lastTime; // 根据需求 if (mSettings.isVaildValue(AlarmLastTimeOptionName, lastTime)) { @@ -179,14 +184,16 @@ void SystemMonitorService::setAlaramLastTimeInterval(qint64 lastTime) int SystemMonitorService::getAlarmUsageOfCpu() { PrintDBusCaller() - qDebug() << __FUNCTION__ << __LINE__ << " Get Alarm Usage Of Cpu:" << mAlarmCpuUsage; + qCDebug(app) + << __FUNCTION__ << __LINE__ << " Get Alarm Usage Of Cpu:" << mAlarmCpuUsage; return mAlarmCpuUsage; } void SystemMonitorService::setAlarmUsageOfCpu(int usage) { PrintDBusCaller() - qDebug() << __FUNCTION__ << __LINE__ << " Set Alarm Usage Of Cpu:" << usage; + qCDebug(app) + << __FUNCTION__ << __LINE__ << " Set Alarm Usage Of Cpu:" << usage; // 根据需求 if (mSettings.isVaildValue(AlarmCpuUsageOptionName, usage)) { @@ -204,14 +211,16 @@ void SystemMonitorService::setAlarmUsageOfCpu(int usage) int SystemMonitorService::getAlarmUsageOfMemory() { PrintDBusCaller() - qDebug() << __FUNCTION__ << __LINE__ << " Get Alarm Usage Of Memory:" << mAlarmMemoryUsage; + qCDebug(app) + << __FUNCTION__ << __LINE__ << " Get Alarm Usage Of Memory:" << mAlarmMemoryUsage; return mAlarmMemoryUsage; } void SystemMonitorService::setAlarmUsageOfMemory(int usage) { PrintDBusCaller() - qDebug() << __FUNCTION__ << __LINE__ << " Set Alarm Usage Of Memory:" << usage; + qCDebug(app) + << __FUNCTION__ << __LINE__ << " Set Alarm Usage Of Memory:" << usage; // 根据需求 if (mSettings.isVaildValue(AlarmMemUsageOptionName, usage)) { @@ -230,13 +239,13 @@ void SystemMonitorService::showDeepinSystemMoniter() { PrintDBusCaller() - QString cmd("gdbus call -e -d com.deepin.SystemMonitorServer -o /com/deepin/SystemMonitorServer -m com.deepin.SystemMonitorServer.showDeepinSystemMoniter"); - QTimer::singleShot(100, this, [ = ]() { QProcess::startDetached(cmd); }); + QString cmd("gdbus call -e -d com.deepin.SystemMonitorServer -o /com/deepin/SystemMonitorServer -m com.deepin.SystemMonitorServer.showDeepinSystemMoniter"); + QTimer::singleShot(100, this, [=]() { QProcess::startDetached(cmd); }); } void SystemMonitorService::changeAlarmItem(const QString &item, const QDBusVariant &value) { - qDebug() << __FUNCTION__ << __LINE__ << ", item:" << item << ", value:" << value.variant(); + qCDebug(app) << __FUNCTION__ << __LINE__ << ", item:" << item << ", value:" << value.variant(); if (mSettings.itemKeys().contains(item) && mSettings.isVaildValue(item, value.variant())) { if (mSettings.isVaildValue(item, value.variant())) { if (item == AlarmStatusOptionName) { @@ -268,7 +277,7 @@ bool SystemMonitorService::checkCpuAlarm() if (mCpuUsage >= mAlarmCpuUsage && diffTime >= timeGap) { mLastAlarmTimeStamp = curTimeStamp; QString cmd = QString("gdbus call -e -d com.deepin.SystemMonitorServer -o /com/deepin/SystemMonitorServer -m com.deepin.SystemMonitorServer.showCpuAlarmNotify \"%1\" ").arg(QString::number(mCpuUsage)); - QTimer::singleShot(100, this, [ = ]() { QProcess::startDetached(cmd); }); + QTimer::singleShot(100, this, [=]() { QProcess::startDetached(cmd); }); } return false; @@ -283,7 +292,7 @@ bool SystemMonitorService::checkMemoryAlarm() if (mMemoryUsage >= mAlarmMemoryUsage && diffTime > timeGap) { mLastAlarmTimeStamp = curTimeStamp; QString cmd = QString("gdbus call -e -d com.deepin.SystemMonitorServer -o /com/deepin/SystemMonitorServer -m com.deepin.SystemMonitorServer.showMemoryAlarmNotify \"%1\" ").arg(QString::number(mMemoryUsage)); - QTimer::singleShot(100, this, [ = ]() { QProcess::startDetached(cmd); }); + QTimer::singleShot(100, this, [=]() { QProcess::startDetached(cmd); }); } return false; diff --git a/deepin-system-monitor-main/3rdparty/displayjack/wayland_client.h b/deepin-system-monitor-main/3rdparty/displayjack/wayland_client.h new file mode 100644 index 00000000..f807f0f9 --- /dev/null +++ b/deepin-system-monitor-main/3rdparty/displayjack/wayland_client.h @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef DTK_WMJACK_WAYLAND_CLIENT_H +#define DTK_WMJACK_WAYLAND_CLIENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include + +typedef struct Dtk_Window_State +{ + int32_t pid; + int32_t windowId; + char resourceName[256]; + struct Geometry + { + int32_t x; + int32_t y; + int32_t width; + int32_t height; + } geometry; + bool isMinimized; + bool isFullScreen; + bool isActive; + int32_t splitable; + char uuid[256]; +} WindowState; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/deepin-system-monitor-main/CMakeLists.txt b/deepin-system-monitor-main/CMakeLists.txt index 153447d1..2b0baa5a 100644 --- a/deepin-system-monitor-main/CMakeLists.txt +++ b/deepin-system-monitor-main/CMakeLists.txt @@ -38,8 +38,17 @@ check_symbol_exists(syscall "unistd.h" HAVE_SYS_CALL) check_symbol_exists(SYS_getrandom "sys/syscall.h" HAVE_SYS_GETRANDOM) include(FindPkgConfig) if (USE_DEEPIN_WAYLAND) + find_package(DWayland) find_package(KF5Wayland) + if (DWayland_FOUND) + message("DWayland founded.") + add_definitions(-DDWAYLAND) + elseif(KF5Wayland_FOUND) + message("KF5Wayland founded.") + add_definitions(-DKF5WAYLAND) + endif() endif() + find_package(Qt5 COMPONENTS Core REQUIRED) find_package(Qt5 COMPONENTS Widgets REQUIRED) find_package(Qt5 COMPONENTS Gui REQUIRED) @@ -52,27 +61,27 @@ find_package(DtkCore REQUIRED) find_package(DtkGui REQUIRED) find_package(DtkWidget REQUIRED) find_library(LIB_PCAP NAMES pcap REQUIRED) -find_library(LIB_PROCPS NAMES procps REQUIRED) find_library(LIB_XCB NAMES xcb REQUIRED) find_library(LIB_XEXT NAMES Xext REQUIRED) find_library(LIB_ICCCM NAMES xcb-icccm REQUIRED) find_package(ICU COMPONENTS i18n uc REQUIRED) -pkg_search_module(DFrameworkDBus REQUIRED dframeworkdbus) # chinalife +#pkg_search_module(DFrameworkDBus REQUIRED dframeworkdbus) # chinalife pkg_search_module(LIB_NL3 REQUIRED libnl-3.0) pkg_search_module(LIB_NL3_ROUTE REQUIRED libnl-route-3.0) pkg_search_module(LIB_UDEV REQUIRED libudev) -include_directories(${LIB_NL3_INCLUDE_DIRS}) -include_directories(${LIB_NL3_ROUTE_INCLUDE_DIRS}) -include_directories(${LIB_UDEV_INCLUDE_DIRS}) include_directories(${DtkCore_INCLUDE_DIRS}) include_directories(${DtkGui_INCLUDE_DIRS}) include_directories(${DtkWidget_INCLUDE_DIRS}) + +include_directories(${LIB_NL3_INCLUDE_DIRS}) +include_directories(${LIB_NL3_ROUTE_INCLUDE_DIRS}) +include_directories(${LIB_UDEV_INCLUDE_DIRS}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/include) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/libsmartcols/src) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../) -include_directories(${DFrameworkDBus_INCLUDE_DIRS}) # chinalife +#include_directories(${DFrameworkDBus_INCLUDE_DIRS}) # chinalife #安全测试加固编译参数 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -z relro -z now -z noexecstack -pie") @@ -98,6 +107,8 @@ set(HPP_GLOBAL smooth_curve_generator.h settings.h detailwidgetmanager.h + logger.h + ddlog.h ) set(CPP_GLOBAL main.cpp @@ -112,6 +123,7 @@ set(CPP_GLOBAL smooth_curve_generator.cpp settings.cpp detailwidgetmanager.cpp + logger.cpp ) set(HPP_COMMON @@ -544,6 +556,10 @@ set(DMIDECODE 3rdparty/dmidecode/util.c ) +set(DMIDECODE_HEADS + 3rdparty/displayjack/wayland_client.h + ) + set(APP_HPP ${CMAKE_HOME_DIRECTORY}/config.h ${HPP_GLOBAL} @@ -582,7 +598,6 @@ set(LIBS dtkwidget dtkgui ${LIB_PCAP} - ${LIB_PROCPS} ICU::i18n ICU::uc ${LIB_XCB} @@ -591,10 +606,16 @@ set(LIBS ${LIB_NL3_LIBRARIES} ${LIB_NL3_ROUTE_LIBRARIES} ${LIB_UDEV_LIBRARIES} - ${DFrameworkDBus_LIBRARIES} # chinalife +# ${DFrameworkDBus_LIBRARIES} # chinalife + Dtk::Core ) + if (USE_DEEPIN_WAYLAND) - list(APPEND LIBS KF5::WaylandClient KF5::WaylandServer) + if (DWayland_FOUND) + list(APPEND LIBS DWaylandClient DWaylandServer) + else() + list(APPEND LIBS KF5::WaylandClient KF5::WaylandServer) + endif() endif() file(GLOB APP_TS_FILES LIST_DIRECTORIES false translations/*.ts) diff --git a/deepin-system-monitor-main/common/common.cpp b/deepin-system-monitor-main/common/common.cpp index 8404aed6..c8780794 100644 --- a/deepin-system-monitor-main/common/common.cpp +++ b/deepin-system-monitor-main/common/common.cpp @@ -6,6 +6,7 @@ #include "common.h" #include "stack_trace.h" #include "hash.h" +#include "helper.hpp" #include #include @@ -208,6 +209,8 @@ void WaylandSearchCentered() if (XDG_SESSION_TYPE == QLatin1String("wayland") || WAYLAND_DISPLAY.contains(QLatin1String("wayland"), Qt::CaseInsensitive)) { WaylandCentered = true; + if (!common::systemInfo().isOldVersion()) + qputenv("QT_WAYLAND_SHELL_INTEGRATION", "kwayland-shell"); } else { WaylandCentered = false; } diff --git a/deepin-system-monitor-main/common/common.h b/deepin-system-monitor-main/common/common.h index d127272f..5701effb 100644 --- a/deepin-system-monitor-main/common/common.h +++ b/deepin-system-monitor-main/common/common.h @@ -18,9 +18,9 @@ #include #include #include - +#include "ddlog.h" class QPainter; - +using namespace DDLog; namespace common { namespace compat { @@ -29,7 +29,8 @@ template struct Callback; template -struct Callback { +struct Callback +{ template static Ret callback(Args... args) { @@ -40,25 +41,28 @@ struct Callback { template std::function Callback::func; -} // namespace compat +} // namespace compat namespace alloc { -struct uFDClose { +struct uFDClose +{ void operator()(int *fd) { close(*fd); } }; -struct uFileClose { +struct uFileClose +{ void operator()(FILE *fp) { fclose(fp); } }; -struct uCloseDir { +struct uCloseDir +{ void operator()(DIR *dir) { closedir(dir); @@ -69,7 +73,7 @@ using uFD = std::unique_ptr; using uFile = std::unique_ptr; using uDir = std::unique_ptr; -} // namespace alloc +} // namespace alloc namespace init { @@ -92,8 +96,8 @@ extern unsigned long HZ; #define CPU_AVERAGE_MAX_FREQUENCY 2300 //CPU最大主频 enum CPUMaxFreq { - High, //>=2.3GHz - Low //>=2.3GHz + High, //>=2.3GHz + Low //>=2.3GHz }; extern CPUMaxFreq CPUPerformance; @@ -101,25 +105,25 @@ extern CPUMaxFreq CPUPerformance; void global_init(); void WaylandSearchCentered(); -} // namespace init +} // namespace init namespace format { enum SizeUnit { - B, // 1024 ^ 0 - KB, // 1024 ^ 1 - MB, // 1024 ^ 2 - GB, // 1024 ^ 3 - TB, // 1024 ^ 4 - PB, // 1024 ^ 5 - EB // 1024 ^ 6 + B, // 1024 ^ 0 + KB, // 1024 ^ 1 + MB, // 1024 ^ 2 + GB, // 1024 ^ 3 + TB, // 1024 ^ 4 + PB, // 1024 ^ 5 + EB // 1024 ^ 6 }; -const char *const UnitSuffix[] = {"B", "K", "M", "G", "T", "P", "E"}; +const char *const UnitSuffix[] = { "B", "K", "M", "G", "T", "P", "E" }; //网络使用单位bite -const char *const UnitSuffixnet[] = {"b", "Kb", "Mb", "Gb", "Tb", "Pb", "Eb"}; +const char *const UnitSuffixnet[] = { "b", "Kb", "Mb", "Gb", "Tb", "Pb", "Eb" }; //内存、磁盘使用单位Byte -const char *const UnitSuffixother[] = {"B", "KB", "MB", "GB", "TB", "PB", "EB"}; +const char *const UnitSuffixother[] = { "B", "KB", "MB", "GB", "TB", "PB", "EB" }; //内存、磁盘统一单位 QString formatUnit_memory_disk(QVariant size, SizeUnit base = B, int prec = 1, bool isSpeed = false); @@ -127,40 +131,42 @@ QString formatUnit_memory_disk(QVariant size, SizeUnit base = B, int prec = 1, b QString formatUnit_net(QVariant size, SizeUnit base = B, int prec = 1, bool isSpeed = false); enum HzUnit { - KHz, // 10 ^ 3 - MHz, // 10 ^ 6 - GHz, // 10 ^ 9 - THz, // 10 ^ 12 - PHz, // 10 ^ 15 - EHz, // 10 ^ 18 - ZHz // 10 ^ 21 + KHz, // 10 ^ 3 + MHz, // 10 ^ 6 + GHz, // 10 ^ 9 + THz, // 10 ^ 12 + PHz, // 10 ^ 15 + EHz, // 10 ^ 18 + ZHz // 10 ^ 21 }; -const char *const HzUnitSuffix[] = {"KHz", "MHz", "GHz", "THz", "PHz", "EHz", "ZHz"}; +const char *const HzUnitSuffix[] = { "KHz", "MHz", "GHz", "THz", "PHz", "EHz", "ZHz" }; QString formatHz(quint32 freq, HzUnit base = KHz, int prec = 2); -} // namespace format +} // namespace format namespace error { inline void print_errno(decltype(errno) e, const QString msg) { - qWarning() << QString("Error: [%1] %2, ").arg(e).arg(strerror(e)) << msg; + qCWarning(app) << QString("Error: [%1] %2, ").arg(e).arg(strerror(e)) << msg; } -} // namespace error +} // namespace error namespace time { inline const struct timeval operator-(const struct timeval &lhs, const struct timeval &rhs) { - struct timeval res { + struct timeval res + { }; timersub(&lhs, &rhs, &res); return res; } inline const struct timeval operator+(const struct timeval &lhs, const struct timeval &rhs) { - struct timeval res { + struct timeval res + { }; timeradd(&lhs, &rhs, &res); return res; @@ -176,9 +182,9 @@ inline struct timeval &operator+=(struct timeval &lhs, const struct timeval &rhs return lhs; } -} // namespace time +} // namespace time -int getStatusBarMaxWidth(); +int getStatusBarMaxWidth(); void displayShortcutHelpDialog(const QRect &rect); void drawLoadingRing(QPainter &painter, int centerX, int centerY, int radius, int penWidth, int loadingAngle, int rotationAngle, QColor foregroundColor, @@ -189,6 +195,6 @@ void drawRing(QPainter &painter, int centerX, int centerY, int radius, int penWi void openFilePathItem(const QString &path); bool startWithHanzi(const QString &text); -} // namespace common +} // namespace common #endif diff --git a/deepin-system-monitor-main/common/han_latin.cpp b/deepin-system-monitor-main/common/han_latin.cpp index ef73a370..3d0e6915 100644 --- a/deepin-system-monitor-main/common/han_latin.cpp +++ b/deepin-system-monitor-main/common/han_latin.cpp @@ -4,7 +4,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "han_latin.h" - +#include "ddlog.h" #include #include #include @@ -20,7 +20,7 @@ using namespace std; using namespace icu; - +using namespace DDLog; namespace util { namespace common { @@ -33,15 +33,15 @@ static QString parseError(const QString &words, UErrorCode &ec, const UParseErro #undef u_errorName #define UERRORNAME U_DEF2_ICU_ENTRY_POINT_RENAME(u_errorName, U_ICU_VERSION_SUFFIX) errbuf = QString( - "Error[%1]: %2 convert %3 to PINYIN failed. [line:%4 offset:%5 " - "preContext: %6 postContext: %7]") - .arg(ec) - .arg(UERRORNAME(ec)) - .arg(words) - .arg(pe.line) - .arg(pe.offset) - .arg(QString::fromStdString(UnicodeString(pe.preContext).toUTF8String(pre))) - .arg(QString::fromStdString(UnicodeString(pe.postContext).toUTF8String(post))); + "Error[%1]: %2 convert %3 to PINYIN failed. [line:%4 offset:%5 " + "preContext: %6 postContext: %7]") + .arg(ec) + .arg(UERRORNAME(ec)) + .arg(words) + .arg(pe.line) + .arg(pe.offset) + .arg(QString::fromStdString(UnicodeString(pe.preContext).toUTF8String(pre))) + .arg(QString::fromStdString(UnicodeString(pe.postContext).toUTF8String(post))); return errbuf; } @@ -52,25 +52,25 @@ QString convHanToLatin(const QString &words) UErrorCode ec = U_ZERO_ERROR; UParseError pe {}; unique_ptr tr(Transliterator::createInstance( - TRANSLITERATION_HAN_LATIN, UTransDirection::UTRANS_FORWARD, pe, ec)); + TRANSLITERATION_HAN_LATIN, UTransDirection::UTRANS_FORWARD, pe, ec)); UnicodeString ubuf = UnicodeString::fromUTF8(StringPiece(words.toStdString())); // from hanzi to latin tr->transliterate(ubuf); if (U_FAILURE(ec)) { - qDebug() << parseError(words, ec, pe); + qCDebug(app) << parseError(words, ec, pe); result = words; } else { ec = U_ZERO_ERROR; pe = {}; unique_ptr tr2(Transliterator::createInstance( - TRANSLITERATION_LATIN_ASCII, UTransDirection::UTRANS_FORWARD, pe, ec)); + TRANSLITERATION_LATIN_ASCII, UTransDirection::UTRANS_FORWARD, pe, ec)); // from latin to ascii (pinyin) tr2->transliterate(ubuf); if (U_FAILURE(ec)) { - qDebug() << parseError(words, ec, pe); + qCDebug(app) << parseError(words, ec, pe); result = words; } else { std::string buffer; @@ -81,5 +81,5 @@ QString convHanToLatin(const QString &words) return result; } -} // namespace common -} // namespace util +} // namespace common +} // namespace util diff --git a/deepin-system-monitor-main/common/hash.cpp b/deepin-system-monitor-main/common/hash.cpp index 59c26429..7f8a4a19 100644 --- a/deepin-system-monitor-main/common/hash.cpp +++ b/deepin-system-monitor-main/common/hash.cpp @@ -14,9 +14,9 @@ #include #include #if defined HAVE_SYS_RANDOM_H -#include -#elif defined HAVE_SYS_CALL && defined HAVE_SYS_GETRANDOM -#include +# include +#elif defined HAVE_SYS_CALL && defined HAVE_SYS_GETRANDOM +# include #endif #include @@ -38,8 +38,8 @@ inline uint64_t rotl64(uint64_t x, int8_t r) return (x << r) | (x >> (64 - r)); } -#define ROTL32(x,y) rotl32(x,y) -#define ROTL64(x,y) rotl64(x,y) +#define ROTL32(x, y) rotl32(x, y) +#define ROTL64(x, y) rotl64(x, y) #define BIG_CONSTANT(x) (x##LLU) @@ -121,10 +121,18 @@ void hash_x86_32(const void *key, int len, uint32_t seed, uint32_t *out) uint32_t k1 = 0; switch (len & 3) { - case 3: k1 ^= uint32_t(tail[2] << 16); [[clang::fallthrough]]; - case 2: k1 ^= uint32_t(tail[1] << 8); [[clang::fallthrough]]; - case 1: k1 ^= tail[0]; - k1 *= c1; k1 = ROTL32(k1, 15); k1 *= c2; h1 ^= k1; + case 3: + k1 ^= uint32_t(tail[2] << 16); + [[clang::fallthrough]]; + case 2: + k1 ^= uint32_t(tail[1] << 8); + [[clang::fallthrough]]; + case 1: + k1 ^= tail[0]; + k1 *= c1; + k1 = ROTL32(k1, 15); + k1 *= c2; + h1 ^= k1; }; //---------- @@ -165,21 +173,41 @@ void hash_x86_128(const void *key, const int len, uint32_t seed, uint64_t out[2] uint32_t k3 = getblock32(blocks, i * 4 + 2); uint32_t k4 = getblock32(blocks, i * 4 + 3); - k1 *= c1; k1 = ROTL32(k1, 15); k1 *= c2; h1 ^= k1; + k1 *= c1; + k1 = ROTL32(k1, 15); + k1 *= c2; + h1 ^= k1; - h1 = ROTL32(h1, 19); h1 += h2; h1 = h1 * 5 + 0x561ccd1b; + h1 = ROTL32(h1, 19); + h1 += h2; + h1 = h1 * 5 + 0x561ccd1b; - k2 *= c2; k2 = ROTL32(k2, 16); k2 *= c3; h2 ^= k2; + k2 *= c2; + k2 = ROTL32(k2, 16); + k2 *= c3; + h2 ^= k2; - h2 = ROTL32(h2, 17); h2 += h3; h2 = h2 * 5 + 0x0bcaa747; + h2 = ROTL32(h2, 17); + h2 += h3; + h2 = h2 * 5 + 0x0bcaa747; - k3 *= c3; k3 = ROTL32(k3, 17); k3 *= c4; h3 ^= k3; + k3 *= c3; + k3 = ROTL32(k3, 17); + k3 *= c4; + h3 ^= k3; - h3 = ROTL32(h3, 15); h3 += h4; h3 = h3 * 5 + 0x96cd1c35; + h3 = ROTL32(h3, 15); + h3 += h4; + h3 = h3 * 5 + 0x96cd1c35; - k4 *= c4; k4 = ROTL32(k4, 18); k4 *= c1; h4 ^= k4; + k4 *= c4; + k4 = ROTL32(k4, 18); + k4 *= c1; + h4 ^= k4; - h4 = ROTL32(h4, 13); h4 += h1; h4 = h4 * 5 + 0x32ac3b17; + h4 = ROTL32(h4, 13); + h4 += h1; + h4 = h4 * 5 + 0x32ac3b17; } //---------- @@ -193,45 +221,94 @@ void hash_x86_128(const void *key, const int len, uint32_t seed, uint64_t out[2] uint32_t k4 = 0; switch (len & 15) { - case 15: k4 ^= uint32_t(tail[14] << 16); [[clang::fallthrough]]; - case 14: k4 ^= uint32_t(tail[13] << 8); [[clang::fallthrough]]; - case 13: k4 ^= uint32_t(tail[12] << 0); - k4 *= c4; k4 = ROTL32(k4, 18); k4 *= c1; h4 ^= k4; + case 15: + k4 ^= uint32_t(tail[14] << 16); + [[clang::fallthrough]]; + case 14: + k4 ^= uint32_t(tail[13] << 8); + [[clang::fallthrough]]; + case 13: + k4 ^= uint32_t(tail[12] << 0); + k4 *= c4; + k4 = ROTL32(k4, 18); + k4 *= c1; + h4 ^= k4; [[clang::fallthrough]]; - case 12: k3 ^= uint32_t(tail[11] << 24); [[clang::fallthrough]]; - case 11: k3 ^= uint32_t(tail[10] << 16); [[clang::fallthrough]]; - case 10: k3 ^= uint32_t(tail[ 9] << 8); [[clang::fallthrough]]; - case 9: k3 ^= uint32_t(tail[ 8] << 0); - k3 *= c3; k3 = ROTL32(k3, 17); k3 *= c4; h3 ^= k3; + case 12: + k3 ^= uint32_t(tail[11] << 24); [[clang::fallthrough]]; - case 8: k2 ^= uint32_t(tail[ 7] << 24); [[clang::fallthrough]]; - case 7: k2 ^= uint32_t(tail[ 6] << 16); [[clang::fallthrough]]; - case 6: k2 ^= uint32_t(tail[ 5] << 8); [[clang::fallthrough]]; - case 5: k2 ^= uint32_t(tail[ 4] << 0); - k2 *= c2; k2 = ROTL32(k2, 16); k2 *= c3; h2 ^= k2; + case 11: + k3 ^= uint32_t(tail[10] << 16); [[clang::fallthrough]]; - case 4: k1 ^= uint32_t(tail[ 3] << 24); [[clang::fallthrough]]; - case 3: k1 ^= uint32_t(tail[ 2] << 16); [[clang::fallthrough]]; - case 2: k1 ^= uint32_t(tail[ 1] << 8); [[clang::fallthrough]]; - case 1: k1 ^= uint32_t(tail[ 0] << 0); - k1 *= c1; k1 = ROTL32(k1, 15); k1 *= c2; h1 ^= k1; + case 10: + k3 ^= uint32_t(tail[9] << 8); + [[clang::fallthrough]]; + case 9: + k3 ^= uint32_t(tail[8] << 0); + k3 *= c3; + k3 = ROTL32(k3, 17); + k3 *= c4; + h3 ^= k3; + [[clang::fallthrough]]; + case 8: + k2 ^= uint32_t(tail[7] << 24); + [[clang::fallthrough]]; + case 7: + k2 ^= uint32_t(tail[6] << 16); + [[clang::fallthrough]]; + case 6: + k2 ^= uint32_t(tail[5] << 8); + [[clang::fallthrough]]; + case 5: + k2 ^= uint32_t(tail[4] << 0); + k2 *= c2; + k2 = ROTL32(k2, 16); + k2 *= c3; + h2 ^= k2; + [[clang::fallthrough]]; + case 4: + k1 ^= uint32_t(tail[3] << 24); + [[clang::fallthrough]]; + case 3: + k1 ^= uint32_t(tail[2] << 16); + [[clang::fallthrough]]; + case 2: + k1 ^= uint32_t(tail[1] << 8); + [[clang::fallthrough]]; + case 1: + k1 ^= uint32_t(tail[0] << 0); + k1 *= c1; + k1 = ROTL32(k1, 15); + k1 *= c2; + h1 ^= k1; }; //---------- // finalization - h1 ^= uint32_t(len); h2 ^= uint32_t(len); h3 ^= uint32_t(len); h4 ^= uint32_t(len); + h1 ^= uint32_t(len); + h2 ^= uint32_t(len); + h3 ^= uint32_t(len); + h4 ^= uint32_t(len); - h1 += h2; h1 += h3; h1 += h4; - h2 += h1; h3 += h1; h4 += h1; + h1 += h2; + h1 += h3; + h1 += h4; + h2 += h1; + h3 += h1; + h4 += h1; h1 = fmix32(h1); h2 = fmix32(h2); h3 = fmix32(h3); h4 = fmix32(h4); - h1 += h2; h1 += h3; h1 += h4; - h2 += h1; h3 += h1; h4 += h1; + h1 += h2; + h1 += h3; + h1 += h4; + h2 += h1; + h3 += h1; + h4 += h1; out[0] = uint64_t(h2) << 32 | h1; out[1] = uint64_t(h4) << 32 | h3; @@ -259,13 +336,23 @@ void hash_x64_128(const void *key, const int len, uint32_t seed, uint64_t out[2] uint64_t k1 = getblock64(blocks, i * 2 + 0); uint64_t k2 = getblock64(blocks, i * 2 + 1); - k1 *= c1; k1 = ROTL64(k1, 31); k1 *= c2; h1 ^= k1; + k1 *= c1; + k1 = ROTL64(k1, 31); + k1 *= c2; + h1 ^= k1; - h1 = ROTL64(h1, 27); h1 += h2; h1 = h1 * 5 + 0x52dce729; + h1 = ROTL64(h1, 27); + h1 += h2; + h1 = h1 * 5 + 0x52dce729; - k2 *= c2; k2 = ROTL64(k2, 33); k2 *= c1; h2 ^= k2; + k2 *= c2; + k2 = ROTL64(k2, 33); + k2 *= c1; + h2 ^= k2; - h2 = ROTL64(h2, 31); h2 += h1; h2 = h2 * 5 + 0x38495ab5; + h2 = ROTL64(h2, 31); + h2 += h1; + h2 = h2 * 5 + 0x38495ab5; } //---------- @@ -277,30 +364,65 @@ void hash_x64_128(const void *key, const int len, uint32_t seed, uint64_t out[2] uint64_t k2 = 0; switch (len & 15) { - case 15: k2 ^= (uint64_t(tail[14])) << 48; [[clang::fallthrough]]; - case 14: k2 ^= (uint64_t(tail[13])) << 40; [[clang::fallthrough]]; - case 13: k2 ^= (uint64_t(tail[12])) << 32; [[clang::fallthrough]]; - case 12: k2 ^= (uint64_t(tail[11])) << 24; [[clang::fallthrough]]; - case 11: k2 ^= (uint64_t(tail[10])) << 16; [[clang::fallthrough]]; - case 10: k2 ^= (uint64_t(tail[ 9])) << 8; [[clang::fallthrough]]; - case 9: k2 ^= (uint64_t(tail[ 8])) << 0; - k2 *= c2; k2 = ROTL64(k2, 33); k2 *= c1; h2 ^= k2; + case 15: + k2 ^= (uint64_t(tail[14])) << 48; + [[clang::fallthrough]]; + case 14: + k2 ^= (uint64_t(tail[13])) << 40; + [[clang::fallthrough]]; + case 13: + k2 ^= (uint64_t(tail[12])) << 32; + [[clang::fallthrough]]; + case 12: + k2 ^= (uint64_t(tail[11])) << 24; + [[clang::fallthrough]]; + case 11: + k2 ^= (uint64_t(tail[10])) << 16; [[clang::fallthrough]]; - case 8: k1 ^= (uint64_t(tail[ 7])) << 56; [[clang::fallthrough]]; - case 7: k1 ^= (uint64_t(tail[ 6])) << 48; [[clang::fallthrough]]; - case 6: k1 ^= (uint64_t(tail[ 5])) << 40; [[clang::fallthrough]]; - case 5: k1 ^= (uint64_t(tail[ 4])) << 32; [[clang::fallthrough]]; - case 4: k1 ^= (uint64_t(tail[ 3])) << 24; [[clang::fallthrough]]; - case 3: k1 ^= (uint64_t(tail[ 2])) << 16; [[clang::fallthrough]]; - case 2: k1 ^= (uint64_t(tail[ 1])) << 8; [[clang::fallthrough]]; - case 1: k1 ^= (uint64_t(tail[ 0])) << 0; - k1 *= c1; k1 = ROTL64(k1, 31); k1 *= c2; h1 ^= k1; + case 10: + k2 ^= (uint64_t(tail[9])) << 8; + [[clang::fallthrough]]; + case 9: + k2 ^= (uint64_t(tail[8])) << 0; + k2 *= c2; + k2 = ROTL64(k2, 33); + k2 *= c1; + h2 ^= k2; + [[clang::fallthrough]]; + case 8: + k1 ^= (uint64_t(tail[7])) << 56; + [[clang::fallthrough]]; + case 7: + k1 ^= (uint64_t(tail[6])) << 48; + [[clang::fallthrough]]; + case 6: + k1 ^= (uint64_t(tail[5])) << 40; + [[clang::fallthrough]]; + case 5: + k1 ^= (uint64_t(tail[4])) << 32; + [[clang::fallthrough]]; + case 4: + k1 ^= (uint64_t(tail[3])) << 24; + [[clang::fallthrough]]; + case 3: + k1 ^= (uint64_t(tail[2])) << 16; + [[clang::fallthrough]]; + case 2: + k1 ^= (uint64_t(tail[1])) << 8; + [[clang::fallthrough]]; + case 1: + k1 ^= (uint64_t(tail[0])) << 0; + k1 *= c1; + k1 = ROTL64(k1, 31); + k1 *= c2; + h1 ^= k1; }; //---------- // finalization - h1 ^= uint64_t(len); h2 ^= uint64_t(len); + h1 ^= uint64_t(len); + h2 ^= uint64_t(len); h1 += h2; h2 += h1; @@ -345,17 +467,17 @@ void init_seed() if (!ok) { int fd = open("/dev/urandom", O_RDONLY); if (fd == -1) { - qCritical() << "init seed from /dev/urandom failed"; + qCCritical(app) << "init seed from /dev/urandom failed"; abort(); } auto nr = read(fd, &global_seed, sizeof(uint32_t)); if (nr <= 0 || ulong(nr) < sizeof(uint32_t)) { - qCritical() << "init seed from /dev/urandom failed"; + qCCritical(app) << "init seed from /dev/urandom failed"; abort(); } close(fd); } } -} // namespace common -} // namespace util +} // namespace common +} // namespace util diff --git a/deepin-system-monitor-main/common/hash.h b/deepin-system-monitor-main/common/hash.h index 9e6ada75..e51ec70e 100644 --- a/deepin-system-monitor-main/common/hash.h +++ b/deepin-system-monitor-main/common/hash.h @@ -8,7 +8,8 @@ #include #include - +#include "ddlog.h" +using namespace DDLog; namespace util { namespace common { @@ -46,7 +47,7 @@ inline void hash(const void *key, int len, uint32_t seed, uint64_t out[2]) #endif } -} // namespace common -} // namespace util +} // namespace common +} // namespace util -#endif // HASH_H +#endif // HASH_H diff --git a/deepin-system-monitor-main/common/perf.cpp b/deepin-system-monitor-main/common/perf.cpp index f550a88f..fe463156 100644 --- a/deepin-system-monitor-main/common/perf.cpp +++ b/deepin-system-monitor-main/common/perf.cpp @@ -2,12 +2,13 @@ // SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later - +#include "ddlog.h" #include "perf.h" #include #include #include +using namespace DDLog; DebugTimeManager *DebugTimeManager::s_Instance = nullptr; @@ -36,6 +37,6 @@ void DebugTimeManager::endPointLinux(const QString &point) struct timeval tv; gettimeofday(&tv, nullptr); m_MapPoint[point].time = tv.tv_sec * 1000 + tv.tv_usec / 1000 - m_MapPoint[point].time; - qInfo() << QString("[GRABPOINT] %1 %2 time=%3ms").arg(point).arg(m_MapPoint[point].desc).arg(m_MapPoint[point].time); + qCInfo(app) << QString("[GRABPOINT] %1 %2 time=%3ms").arg(point).arg(m_MapPoint[point].desc).arg(m_MapPoint[point].time); } } diff --git a/deepin-system-monitor-main/common/sample.h b/deepin-system-monitor-main/common/sample.h index 94cbe815..16677775 100644 --- a/deepin-system-monitor-main/common/sample.h +++ b/deepin-system-monitor-main/common/sample.h @@ -223,7 +223,7 @@ class SampleFrame auto cwdiff = (ccwb < pcwb) ? 0 : (ccwb - pcwb); // calculate read/write speed rdio = qreal(rdiff) / interval; - wrio = qreal(wdiff - cwdiff) / interval; + wrio = (wdiff < cwdiff) ? 0 : qreal(wdiff - cwdiff) / interval; return {rdio, wrio}; } diff --git a/deepin-system-monitor-main/compact_cpu_monitor.cpp b/deepin-system-monitor-main/compact_cpu_monitor.cpp index 8c048576..76b65c91 100644 --- a/deepin-system-monitor-main/compact_cpu_monitor.cpp +++ b/deepin-system-monitor-main/compact_cpu_monitor.cpp @@ -29,6 +29,10 @@ DWIDGET_USE_NAMESPACE using namespace common; +// additonPoses to align with the cpu text +const int additionCPUPosX = 3; +const int additionCPUPoxY = 3; + // 通过 UseTotalCpuCurve 宏, 控制绘制CPU曲线方式 // UseTotalCpuCurve: true , 绘制一条总的CPU占用曲线 // UseTotalCpuCurve: false, 绘制每个独立CPU的占用曲线 @@ -170,8 +174,8 @@ void CompactCpuMonitor::resizeEvent(QResizeEvent *event) void CompactCpuMonitor::resizeItemRect() { m_detailButton->setFixedSize(m_detailButton->fontMetrics().width(m_detailButton->text()) + 12, m_detailButton->fontMetrics().height() + 4); - const QSize &detailtextSize = m_detailButton->size(); - m_detailButton->setGeometry(this->width() - detailtextSize.width(), 0, detailtextSize.width(), detailtextSize.height()); + const QSize &detailtextSize = m_detailButton->size(); + m_detailButton->setGeometry(this->width() - detailtextSize.width() + additionCPUPosX, additionCPUPoxY, detailtextSize.width(), detailtextSize.height()); } void CompactCpuMonitor::paintEvent(QPaintEvent *) @@ -255,6 +259,8 @@ void CompactCpuMonitor::paintEvent(QPaintEvent *) dashes << 2 << space; gridPen.setDashPattern(dashes); gridPen.setColor(frameColor); + //set to 0 lead to line with always 1px + gridPen.setWidth(0); painter.setPen(gridPen); int gridLineX = gridX; diff --git a/deepin-system-monitor-main/compact_disk_monitor.cpp b/deepin-system-monitor-main/compact_disk_monitor.cpp index 0830e751..f1fcaec5 100644 --- a/deepin-system-monitor-main/compact_disk_monitor.cpp +++ b/deepin-system-monitor-main/compact_disk_monitor.cpp @@ -193,7 +193,8 @@ void CompactDiskMonitor::paintEvent(QPaintEvent *) qreal space = 2; dashes << 2 << space; gridPen.setColor(frameColor); - gridPen.setWidth(penSize); + //set to 0 lead to line with always 1px + gridPen.setWidth(0); gridPen.setDashPattern(dashes); painter.setPen(gridPen); diff --git a/deepin-system-monitor-main/compact_network_monitor.cpp b/deepin-system-monitor-main/compact_network_monitor.cpp index 2aa27886..b7941e3a 100644 --- a/deepin-system-monitor-main/compact_network_monitor.cpp +++ b/deepin-system-monitor-main/compact_network_monitor.cpp @@ -220,7 +220,8 @@ void CompactNetworkMonitor::paintEvent(QPaintEvent *) qreal space = 2; dashes << 2 << space; gridPen.setColor(m_frameColor); - gridPen.setWidth(penSize); + //set to 0 lead to line with always 1px + gridPen.setWidth(0); gridPen.setDashPattern(dashes); painter.setPen(gridPen); diff --git a/deepin-system-monitor-main/dbus/dbus_object.cpp b/deepin-system-monitor-main/dbus/dbus_object.cpp index a77c75f5..4a3b3032 100644 --- a/deepin-system-monitor-main/dbus/dbus_object.cpp +++ b/deepin-system-monitor-main/dbus/dbus_object.cpp @@ -6,20 +6,19 @@ #include "dbus_object.h" #include "gui/main_window.h" #include "application.h" - +#include "ddlog.h" #include #include -#define DBUS_SERVER "com.deepin.systemMonitor" -#define DBUS_SERVER_PATH "/com/deepin/systemMonitor" - +#define DBUS_SERVER "com.deepin.systemMonitor" +#define DBUS_SERVER_PATH "/com/deepin/systemMonitor" +using namespace DDLog; QMutex DBusObject::mutex; QAtomicPointer DBusObject::instance; DBusObject &DBusObject::getInstance() { - if (instance.testAndSetOrdered(nullptr, nullptr)) - { + if (instance.testAndSetOrdered(nullptr, nullptr)) { QMutexLocker locker(&mutex); instance.testAndSetOrdered(nullptr, new DBusObject); @@ -35,7 +34,7 @@ bool DBusObject::registerOrNotify() QList args; QString error = notification.callWithArgumentList(QDBus::Block, "handleWindow", args).errorMessage(); if (!error.isEmpty()) - qInfo() << error; + qCInfo(app) << error; return false; } @@ -62,12 +61,11 @@ void DBusObject::handleWindow() internalMutex.unlock(); } -DBusObject::DBusObject(QObject *parent) : QObject(parent) +DBusObject::DBusObject(QObject *parent) + : QObject(parent) { - } DBusObject::~DBusObject() { - } diff --git a/deepin-system-monitor-main/dbus/dbusalarmnotify.cpp b/deepin-system-monitor-main/dbus/dbusalarmnotify.cpp index 8ccf77a5..38eba532 100644 --- a/deepin-system-monitor-main/dbus/dbusalarmnotify.cpp +++ b/deepin-system-monitor-main/dbus/dbusalarmnotify.cpp @@ -2,8 +2,9 @@ // SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later - +#include "ddlog.h" #include "dbusalarmnotify.h" +#include "helper.hpp" #include #include @@ -11,6 +12,8 @@ #include #include +using namespace DDLog; + #define AlarmMessageTimeOut 10000 QMutex DBusAlarmNotify::mutex; QAtomicPointer DBusAlarmNotify::instance = nullptr; @@ -46,18 +49,17 @@ void DBusAlarmNotify::showAlarmNotify(const QStringList &allArguments) showAlarmNotify(topic, msg, timeout); } } - } void DBusAlarmNotify::showAlarmNotify(QString topic, QString msg, int timeout) { - QDBusMessage ddeNotify = QDBusMessage::createMethodCall("com.deepin.dde.Notification", - "/com/deepin/dde/Notification", - "com.deepin.dde.Notification", + QDBusMessage ddeNotify = QDBusMessage::createMethodCall(common::systemInfo().NotificationService, + common::systemInfo().NotificationPath, + common::systemInfo().NotificationInterface, "Notify"); QStringList action; - action << "_open1" << tr("View"); //添加按钮 - QVariantMap inform; //按钮的点击操作 + action << "_open1" << tr("View"); //添加按钮 + QVariantMap inform; //按钮的点击操作 // 操作打开系统监视器 QString openSystemMonitor = QString("qdbus,org.deepin.SystemMonitorDaemon," "/org/deepin/SystemMonitorDaemon," @@ -66,26 +68,26 @@ void DBusAlarmNotify::showAlarmNotify(QString topic, QString msg, int timeout) inform.insert(QString("x-deepin-action-_open1"), openSystemMonitor); QList ddeArgs; - ddeArgs << QString("deepin-system-monitor"); // app name - ddeArgs << uint(0); // id = 0 不指定窗口 id - ddeArgs << QString("deepin-system-monitor"); // icon - ddeArgs << topic; // notify topic - ddeArgs << msg; // notify msg body - ddeArgs << action; // button - ddeArgs << inform; // button operation - ddeArgs << timeout; // notify timeout + ddeArgs << QString("deepin-system-monitor"); // app name + ddeArgs << uint(0); // id = 0 不指定窗口 id + ddeArgs << QString("deepin-system-monitor"); // icon + ddeArgs << topic; // notify topic + ddeArgs << msg; // notify msg body + ddeArgs << action; // button + ddeArgs << inform; // button operation + ddeArgs << timeout; // notify timeout ddeNotify.setArguments(ddeArgs); QDBusMessage replyMsg = QDBusConnection::sessionBus().call(ddeNotify); if (replyMsg.type() == QDBusMessage::ErrorMessage) { - qWarning() << __FUNCTION__ << __LINE__ << ", dde notify dbus method call fail , error name :" - << replyMsg.errorName() << " , error msg :" << replyMsg.errorMessage(); + qCWarning(app) << __FUNCTION__ << __LINE__ << ", dde notify dbus method call fail , error name :" + << replyMsg.errorName() << " , error msg :" << replyMsg.errorMessage(); QString cmd = QString("gdbus call -e -d org.deepin.SystemMonitorDaemon -o /org/deepin/SystemMonitorDaemon -m org.deepin.SystemMonitorDaemon.setAlaramLastTimeInterval 0"); QProcess::startDetached(cmd); } else { - qint64 lastAlarmTimeStamp = QDateTime::currentDateTime().toMSecsSinceEpoch(); + qint64 lastAlarmTimeStamp = QDateTime::currentDateTime().toMSecsSinceEpoch(); QString cmd = QString("gdbus call -e -d org.deepin.SystemMonitorDaemon -o /org/deepin/SystemMonitorDaemon -m org.deepin.SystemMonitorDaemon.setAlaramLastTimeInterval %1").arg(lastAlarmTimeStamp); QProcess::startDetached(cmd); } @@ -94,5 +96,4 @@ void DBusAlarmNotify::showAlarmNotify(QString topic, QString msg, int timeout) DBusAlarmNotify::DBusAlarmNotify(QObject *parent) : QObject(parent) { - } diff --git a/deepin-system-monitor-main/ddlog.h b/deepin-system-monitor-main/ddlog.h new file mode 100644 index 00000000..fad4bea8 --- /dev/null +++ b/deepin-system-monitor-main/ddlog.h @@ -0,0 +1,15 @@ +// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#ifndef DDLOG_H +#define DDLOG_H +#include +#include +DCORE_USE_NAMESPACE + +namespace DDLog { +inline Q_LOGGING_CATEGORY(app, "org.deepin.system-monitor") +} + +#endif // DDLOG_H diff --git a/deepin-system-monitor-main/gui/accounts_widget.cpp b/deepin-system-monitor-main/gui/accounts_widget.cpp index fd017dcb..01b52a97 100644 --- a/deepin-system-monitor-main/gui/accounts_widget.cpp +++ b/deepin-system-monitor-main/gui/accounts_widget.cpp @@ -1,5 +1,5 @@ #include "accounts_widget.h" - +#include "ddlog.h" #include #include #include @@ -11,20 +11,18 @@ const QMargins ScrollAreaMargins(0, 0, 0, 0); const QString LogoutDescription = "Log out the user may cause data loss, log out or not?"; +using namespace DDLog; + AccountsWidget::AccountsWidget(QWidget *parent) - : QWidget(parent) - , m_userModel(new AccountsInfoModel(this)) - , m_userItemModel(new QStandardItemModel(this)) - , m_userlistView(new UserListView(this)) + : QWidget(parent), m_userModel(new AccountsInfoModel(this)), m_userItemModel(new QStandardItemModel(this)), m_userlistView(new UserListView(this)) { m_currentUserType = m_userModel->getCurrentUserType(); - qInfo() << "AccountsWidget Constructor line 20:" << "current user type:" << m_currentUserType; + qCInfo(app) << "AccountsWidget Constructor line 20:" + << "current user type:" << m_currentUserType; initUI(); initConnection(); addInfo(m_userModel); m_userlistView->resetStatus(m_userItemModel->index(0, 0)); - - } AccountsWidget::~AccountsWidget() @@ -37,16 +35,14 @@ AccountsWidget::~AccountsWidget() if (m_onlineIconList.size() > 0) { m_onlineIconList.clear(); } - } - void AccountsWidget::initUI() { // disable auto fill frame background setAutoFillBackground(false); // set frame background role -// setBackgroundRole(DPalette::Window); + // setBackgroundRole(DPalette::Window); // 禁用横向滚动条,防止内容被截断 QVBoxLayout *mainContentLayout = new QVBoxLayout(this); mainContentLayout->setMargin(0); @@ -73,8 +69,6 @@ void AccountsWidget::initUI() setFixedWidth(250); m_contextMenu = new DMenu(this); - - } void AccountsWidget::initConnection() @@ -84,30 +78,27 @@ void AccountsWidget::initConnection() connect(m_userlistView, &UserListView::signalRightButtonClicked, this, &AccountsWidget::onRightButtonClicked); connect(m_userlistView, &DListView::activated, m_userlistView, &QListView::clicked); - - /******************************* User Operation Menu on right Button Clicked******************************/ -// auto *connectAction = m_contextMenu->addAction("Connect"); -// connect(connectAction, &QAction::triggered, this, &AccountsWidget::onConnectTriggered); + // auto *connectAction = m_contextMenu->addAction("Connect"); + // connect(connectAction, &QAction::triggered, this, &AccountsWidget::onConnectTriggered); -// auto *disconnectAction = m_contextMenu->addAction("Disconnect"); -// connect(disconnectAction, &QAction::triggered, this, &AccountsWidget::onDisconnectTriggered); + // auto *disconnectAction = m_contextMenu->addAction("Disconnect"); + // connect(disconnectAction, &QAction::triggered, this, &AccountsWidget::onDisconnectTriggered); -// auto *logoutAction = m_contextMenu->addAction("log out"); -// connect(logoutAction, &QAction::triggered, this, &AccountsWidget::onLogoutTriggered); + // auto *logoutAction = m_contextMenu->addAction("log out"); + // connect(logoutAction, &QAction::triggered, this, &AccountsWidget::onLogoutTriggered); -// m_contextMenu->addSeparator(); + // m_contextMenu->addSeparator(); auto *EditAction = m_contextMenu->addAction(DApplication::translate("User.Account.Operation", "Edit account information")); connect(EditAction, &QAction::triggered, this, &AccountsWidget::onEditAccountTriggered); - -// //判断当前用户是否为管理员用户,非管理员用户不展示连接和注销功能 -// if (!(m_currentUserType == User::UserType::Administrator)) { -// connectAction->setVisible(false); -// logoutAction->setVisible(false); -// } + // //判断当前用户是否为管理员用户,非管理员用户不展示连接和注销功能 + // if (!(m_currentUserType == User::UserType::Administrator)) { + // connectAction->setVisible(false); + // logoutAction->setVisible(false); + // } /******************************* User Operation Menu on right Button Clicked******************************/ } @@ -122,37 +113,36 @@ void AccountsWidget::onUpdateUserList() } } //新增连接的用户 - qInfo() << m_userList.size() << m_userModel->userList().size(); + qCInfo(app) << m_userList.size() << m_userModel->userList().size(); for (auto user : m_userModel->userList()) { if (!m_userList.contains(user)) { addUser(user); } } - } void AccountsWidget::addInfo(AccountsInfoModel *model) { - qInfo() << "AccountsWidget addInfo line 130:" << "add info from list:" << model->userList(); + qCInfo(app) << "AccountsWidget addInfo line 130:" + << "add info from list:" << model->userList(); //给账户列表添加用户 for (auto user : model->userList()) { - qInfo() << "AccountsWidget addInfo line 132:" << "add user to listview:" << user->name(); + qCInfo(app) << "AccountsWidget addInfo line 132:" + << "add user to listview:" << user->name(); addUser(user); } - } void AccountsWidget::addUser(User *user) { //active - qInfo() << "AccountsWidget addUser line 141:" << "addUser begins:" << user->name(); + qCInfo(app) << "AccountsWidget addUser line 141:" + << "addUser begins:" << user->name(); m_userList << user; DStandardItem *item = new DStandardItem; item->setData(0, AccountsWidget::ItemDataRole); - - auto setTitelFunc = [ = ](int userType, DViewItemAction * subTitleAction) { - + auto setTitelFunc = [=](int userType, DViewItemAction *subTitleAction) { subTitleAction->setText(userType == User::UserType::Administrator ? DApplication::translate("User.Account.Type", "Administrator") : DApplication::translate("User.Account.Type", "Standard User")); }; @@ -160,31 +150,29 @@ void AccountsWidget::addUser(User *user) auto *subTitleAction = new DViewItemAction; setTitelFunc(user->userType(), subTitleAction); - qInfo() << "AccountsWidget addUser line 156:" << "subTitleAction text:" << subTitleAction->text(); - - + qCInfo(app) << "AccountsWidget addUser line 156:" + << "subTitleAction text:" << subTitleAction->text(); subTitleAction->setFontSize(DFontSizeManager::T8); subTitleAction->setTextColorRole(DPalette::TextTips); - item->setTextActionList({subTitleAction}); + item->setTextActionList({ subTitleAction }); -// DViewItemAction *onlineFlag = new DViewItemAction(Qt::AlignCenter | Qt::AlignRight, QSize(), QSize(), true); + // DViewItemAction *onlineFlag = new DViewItemAction(Qt::AlignCenter | Qt::AlignRight, QSize(), QSize(), true); -// OnlineIcon *onlineIcon = new OnlineIcon(m_userlistView->viewport()); -// onlineIcon->setFixedSize(8, 8); -// onlineFlag->setWidget(onlineIcon); -// item->setActionList(Qt::Edge::RightEdge, {onlineFlag}); -// if (!user->online()) { -// onlineIcon->setColor(QColor(Qt::gray)); -// } + // OnlineIcon *onlineIcon = new OnlineIcon(m_userlistView->viewport()); + // onlineIcon->setFixedSize(8, 8); + // onlineFlag->setWidget(onlineIcon); + // item->setActionList(Qt::Edge::RightEdge, {onlineFlag}); + // if (!user->online()) { + // onlineIcon->setColor(QColor(Qt::gray)); + // } -// onlineFlag->setVisible(true); -// if (onlineFlag->widget()) { -// onlineFlag->widget()->setVisible(true); -// } - -// m_onlineIconList << onlineIcon; + // onlineFlag->setVisible(true); + // if (onlineFlag->widget()) { + // onlineFlag->widget()->setVisible(true); + // } + // m_onlineIconList << onlineIcon; m_userItemModel->appendRow(item); @@ -206,7 +194,6 @@ void AccountsWidget::addUser(User *user) m_userList.push_front(user); m_userList.pop_back(); - } } @@ -216,16 +203,14 @@ void AccountsWidget::removeUser(User *user) m_userList.removeOne(user); -// //对于删除的用户Item,不显示小圆点 -// for (int i = m_userItemModel->rowCount(); i < m_onlineIconList.size(); i++) { -// m_onlineIconList.at(i)->setVisible(false); -// } + // //对于删除的用户Item,不显示小圆点 + // for (int i = m_userItemModel->rowCount(); i < m_onlineIconList.size(); i++) { + // m_onlineIconList.at(i)->setVisible(false); + // } m_userlistView->update(); } - - QPixmap AccountsWidget::pixmapToRound(const QPixmap &src) { if (src.isNull()) { @@ -248,7 +233,6 @@ QPixmap AccountsWidget::pixmapToRound(const QPixmap &src) return mask; } - QString AccountsWidget::getCurrentItemUserName() { //判断是否是全名 @@ -260,46 +244,35 @@ QString AccountsWidget::getCurrentItemUserName() return m_userlistView->currentIndex().data().toString(); } - void AccountsWidget::onItemClicked(const QModelIndex &index) { m_userlistView->resetStatus(index); Q_EMIT signalCurrentChanged(); } - - // show process table view context menu on specified positon void AccountsWidget::onRightButtonClicked(const QPoint &p) { QPoint point = mapToGlobal(p); + // QString name = m_userlistView->indexAt(p).data().toString(); + // //获取当前操作的用户对象 + // getUserToBeOperated(name); + // //判断是否为当前用户,当前用户展示断开连接, + // if (m_userToBeOperated->isCurrentUser()) { + // m_contextMenu->actions().at(0)->setVisible(false); + // m_contextMenu->actions().at(1)->setVisible(true); + // } else { + // if (m_currentUserType == User::UserType::Administrator) { + // m_contextMenu->actions().at(0)->setVisible(true); + // } -// QString name = m_userlistView->indexAt(p).data().toString(); -// //获取当前操作的用户对象 -// getUserToBeOperated(name); - -// //判断是否为当前用户,当前用户展示断开连接, -// if (m_userToBeOperated->isCurrentUser()) { -// m_contextMenu->actions().at(0)->setVisible(false); -// m_contextMenu->actions().at(1)->setVisible(true); -// } else { -// if (m_currentUserType == User::UserType::Administrator) { -// m_contextMenu->actions().at(0)->setVisible(true); -// } - -// m_contextMenu->actions().at(1)->setVisible(false); -// } + // m_contextMenu->actions().at(1)->setVisible(false); + // } m_contextMenu->popup(point); - - - - - - } void AccountsWidget::getUserToBeOperated(const QString &userName) { @@ -336,7 +309,6 @@ void AccountsWidget::onLogoutTriggered() } else { return; } - } void AccountsWidget::onEditAccountTriggered() diff --git a/deepin-system-monitor-main/gui/base/base_detail_item_delegate.cpp b/deepin-system-monitor-main/gui/base/base_detail_item_delegate.cpp index c46d4a50..cb349f0d 100644 --- a/deepin-system-monitor-main/gui/base/base_detail_item_delegate.cpp +++ b/deepin-system-monitor-main/gui/base/base_detail_item_delegate.cpp @@ -17,6 +17,8 @@ DWIDGET_USE_NAMESPACE +#define SUMARY_ROW_BG_ALPH 0.03 + const int space = 10; const int margin = 10; BaseDetailItemDelegate::BaseDetailItemDelegate(QObject *parent) @@ -34,10 +36,23 @@ void BaseDetailItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { - auto palette = option.palette; - QBrush background = palette.color(DPalette::Active, DPalette::Base); - if (!(index.row() & 1)) background = palette.color(DPalette::Active, DPalette::AlternateBase); - + QBrush background; + QColor backgroundColor; + if (DApplicationHelper::instance()->themeType() == Dtk::Gui::DGuiApplicationHelper::ColorType::LightType) + { + backgroundColor = QColor(0, 0, 0); + backgroundColor.setAlphaF(0); + if (!(index.row() & 1)) + backgroundColor.setAlphaF(SUMARY_ROW_BG_ALPH); + } + else + { + backgroundColor = QColor(255, 255, 255); + backgroundColor.setAlphaF(0); + if (!(index.row() & 1)) + backgroundColor.setAlphaF(SUMARY_ROW_BG_ALPH); + } + background = backgroundColor; painter->save(); QPainterPath clipPath; clipPath.addRoundedRect(option.widget->rect().adjusted(1, 1, -1, -1), 6, 6); @@ -47,7 +62,8 @@ void BaseDetailItemDelegate::paint(QPainter *painter, painter->setBrush(background); painter->drawRect(option.rect); - if (index.isValid()) { + if (index.isValid()) + { const auto <extpalette = index.data(Qt::TextColorRole).value(); painter->setPen(ltextpalette); diff --git a/deepin-system-monitor-main/gui/base/base_header_view.cpp b/deepin-system-monitor-main/gui/base/base_header_view.cpp index a1affeba..99d733c7 100644 --- a/deepin-system-monitor-main/gui/base/base_header_view.cpp +++ b/deepin-system-monitor-main/gui/base/base_header_view.cpp @@ -34,10 +34,10 @@ QSize BaseHeaderView::sizeHint() const // Paint event handler void BaseHeaderView::paintEvent(QPaintEvent *event) { - DHeaderView::paintEvent(event); - // draw focus - if (hasFocus() && m_focusReason == Qt::TabFocusReason) { + DHeaderView::paintEvent(event); + if (hasFocus() && m_focusReason == Qt::TabFocusReason) + { QPainter painter(viewport()); painter.setRenderHint(QPainter::Antialiasing); @@ -49,10 +49,16 @@ void BaseHeaderView::paintEvent(QPaintEvent *event) QStyleOptionFocusRect o; o.QStyleOption::operator=(option); // need take scroll offset into consideration - QRect focusRect {rect.x() - offset(), rect.y(), length() - sectionPosition(0), rect.height()}; + QRect focusRect{rect.x() - offset(), rect.y(), length() - sectionPosition(0), rect.height()}; o.rect = style->visualRect(layoutDirection(), rect, focusRect); style->drawPrimitive(DStyle::PE_FrameFocusRect, &o, &painter); } + QPainter painter(viewport()); + QPainterPath innerPath,outPath; + innerPath.addRoundedRect(viewport()->rect(),8,8); + outPath.addRect(viewport()->rect()); + outPath=outPath.subtracted(innerPath); + painter.fillPath(outPath,DApplicationHelper::instance()->applicationPalette().color(DPalette::Active,DPalette::AlternateBase)); } void BaseHeaderView::focusInEvent(QFocusEvent *event) diff --git a/deepin-system-monitor-main/gui/base/base_item_delegate.cpp b/deepin-system-monitor-main/gui/base/base_item_delegate.cpp index 3866fae9..094e7628 100644 --- a/deepin-system-monitor-main/gui/base/base_item_delegate.cpp +++ b/deepin-system-monitor-main/gui/base/base_item_delegate.cpp @@ -183,15 +183,18 @@ void BaseItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &opti auto diff = (iconRect.height() - iconSize) / 2; iconRect.adjust(0, diff, 0, -diff); - const QString &procPid = index.data(Qt::UserRole + 4).toString(); - - QPixmap *iconPixmap = nullptr; - core::process::ProcessIconCache::instance()->iconPixmapCache.find(procPid, iconPixmap); - if (iconPixmap) { - painter->drawPixmap(iconRect, *iconPixmap); + // Qt的QIcon::pixmap()接口返回QPixmap对象的内存不会回收,此处使用QPixmapCache类来管理进程图标内存资源 + // 原有QPixmapCache::find接口返回的pixmap指针为空,改为返回pixmap引用对象,保证能根据进程名从缓存中获取到图标资源 + // https://pms.uniontech.com/bug-view-239575.html + const QString &procName = index.data(Qt::UserRole + 4).toString(); + + QPixmap iconPixmap; + core::process::ProcessIconCache::instance()->iconPixmapCache.find(procName, iconPixmap); + if (!iconPixmap.isNull()) { + painter->drawPixmap(iconRect, iconPixmap); } else { const QPixmap &iconPix = icon.pixmap(iconRect.size()); - core::process::ProcessIconCache::instance()->iconPixmapCache.insert(procPid, iconPix); + core::process::ProcessIconCache::instance()->iconPixmapCache.insert(procName, iconPix); painter->drawPixmap(iconRect, iconPix); } } diff --git a/deepin-system-monitor-main/gui/base/base_table_view.cpp b/deepin-system-monitor-main/gui/base/base_table_view.cpp index 809f35f8..071318ea 100644 --- a/deepin-system-monitor-main/gui/base/base_table_view.cpp +++ b/deepin-system-monitor-main/gui/base/base_table_view.cpp @@ -24,6 +24,8 @@ #include #include +#define HEADER_MIN_SECTION_SIZE 120 + // default constructor BaseTableView::BaseTableView(DWidget *parent) : DTreeView(parent) @@ -34,7 +36,6 @@ BaseTableView::BaseTableView(DWidget *parent) // set delegate instance m_itemDelegate = new BaseItemDelegate(this); setItemDelegate(m_itemDelegate); - // set header view instance m_headerView = new BaseHeaderView(Qt::Horizontal, this); setHeader(m_headerView); @@ -54,7 +55,8 @@ BaseTableView::BaseTableView(DWidget *parent) m_headerView->setContextMenuPolicy(Qt::CustomContextMenu); // header view focus policy m_headerView->setFocusPolicy(Qt::StrongFocus); - + // header section context min width + m_headerView->setMinimumSectionSize(HEADER_MIN_SECTION_SIZE); // not allowing expanding/collpasing top-level items setRootIsDecorated(false); // items are not expandable @@ -83,19 +85,23 @@ BaseTableView::BaseTableView(DWidget *parent) scroller->setScrollerProperties(prop); // enable touch gesture QScroller::grabGesture(viewport(), QScroller::TouchGesture); + //set horizontalScrollbar always visible + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); } // set view model void BaseTableView::setModel(QAbstractItemModel *model) { DTreeView::setModel(model); - // listen on modelReset signal, reset any hovered or pressed index if (model) { connect(model, &QAbstractItemModel::modelReset, this, [ = ]() { m_hover = {}; m_pressed = {}; }); +// connect(model, &QAbstractItemModel::rowsRemoved, this, [ = ]() { +// qCWarning(app)<<(model->rowCount()==0); +// }); } } @@ -160,7 +166,6 @@ void BaseTableView::drawRow(QPainter *painter, const QStyleOptionViewItem &optio { painter->save(); painter->setRenderHint(QPainter::Antialiasing); - #ifdef ENABLE_INACTIVE_DISPLAY QWidget *wnd = DApplication::activeWindow(); #endif @@ -182,7 +187,6 @@ void BaseTableView::drawRow(QPainter *painter, const QStyleOptionViewItem &optio cg = DPalette::Active; #endif } - // DStyle instance auto *style = dynamic_cast(DApplication::style()); diff --git a/deepin-system-monitor-main/gui/block_dev_stat_view_widget.cpp b/deepin-system-monitor-main/gui/block_dev_stat_view_widget.cpp index 317c71c8..8c0c021e 100644 --- a/deepin-system-monitor-main/gui/block_dev_stat_view_widget.cpp +++ b/deepin-system-monitor-main/gui/block_dev_stat_view_widget.cpp @@ -13,7 +13,6 @@ #include using namespace core::system; - const int itemSpace = 6; BlockStatViewWidget::BlockStatViewWidget(QWidget *parent) : QScrollArea(parent) { diff --git a/deepin-system-monitor-main/gui/block_dev_summary_view_widget.cpp b/deepin-system-monitor-main/gui/block_dev_summary_view_widget.cpp index cdaf242b..0206d46f 100644 --- a/deepin-system-monitor-main/gui/block_dev_summary_view_widget.cpp +++ b/deepin-system-monitor-main/gui/block_dev_summary_view_widget.cpp @@ -28,6 +28,8 @@ using namespace core::system; using namespace common::format; +#define SUMMARY_CHART_LINE_ALPH 0.13 + class DeailTableModelBlock : public QAbstractTableModel { public: @@ -252,12 +254,11 @@ void BlockDevSummaryViewWidget::fontChanged(const QFont &font) void BlockDevSummaryViewWidget::paintEvent(QPaintEvent *event) { DTableView::paintEvent(event); - QPainter painter(this->viewport()); painter.setRenderHints(QPainter::Antialiasing); const auto &palette = DApplicationHelper::instance()->applicationPalette(); - QColor frameColor = palette.color(DPalette::TextTips); - frameColor.setAlphaF(0.3); + QColor frameColor = palette.color(DPalette::FrameBorder); + frameColor.setAlphaF(SUMMARY_CHART_LINE_ALPH); painter.setPen(QPen(frameColor, 1)); painter.setBrush(Qt::NoBrush); painter.drawLine(this->horizontalHeader()->sectionSize(0) - 1, 2, this->horizontalHeader()->sectionSize(0) - 1, this->viewport()->height() - 2); diff --git a/deepin-system-monitor-main/gui/chart_view_widget.cpp b/deepin-system-monitor-main/gui/chart_view_widget.cpp index 00fa91db..fac45fe1 100644 --- a/deepin-system-monitor-main/gui/chart_view_widget.cpp +++ b/deepin-system-monitor-main/gui/chart_view_widget.cpp @@ -238,6 +238,8 @@ void ChartViewWidget::drawBackPixmap() dashes << space << space; gridPen.setDashPattern(dashes); gridPen.setColor(frameColor); + //set to 0 lead to line with always 1px + gridPen.setWidth(0); painter.setPen(gridPen); int gridLineX = gridX; diff --git a/deepin-system-monitor-main/gui/cpu_detail_widget.cpp b/deepin-system-monitor-main/gui/cpu_detail_widget.cpp index b08caf6a..bb5c0a93 100644 --- a/deepin-system-monitor-main/gui/cpu_detail_widget.cpp +++ b/deepin-system-monitor-main/gui/cpu_detail_widget.cpp @@ -296,6 +296,8 @@ void CPUDetailGrapTableItem::drawBackground(QPainter &painter, const QRect &grap dashes << space << space; gridPen.setDashPattern(dashes); gridPen.setColor(frameColor); + //set to 0 lead to line with always 1px + gridPen.setWidth(0); painter.setPen(gridPen); int section = 10; diff --git a/deepin-system-monitor-main/gui/cpu_summary_view_widget.cpp b/deepin-system-monitor-main/gui/cpu_summary_view_widget.cpp index 8aa1d452..dd6aab09 100644 --- a/deepin-system-monitor-main/gui/cpu_summary_view_widget.cpp +++ b/deepin-system-monitor-main/gui/cpu_summary_view_widget.cpp @@ -5,6 +5,7 @@ #include "cpu_summary_view_widget.h" +#define SUMMARY_CHART_LINE_ALPH 0.13 CPUSummaryTableModel::CPUSummaryTableModel(CPUInfoModel *model, QObject *parent): QAbstractTableModel(parent), m_model(model) { @@ -73,8 +74,8 @@ void CPUDetailSummaryTable::paintEvent(QPaintEvent *event) QPainter painter(this->viewport()); painter.setRenderHint(QPainter::Antialiasing, true); const auto &palette = DApplicationHelper::instance()->applicationPalette(); - QColor frameColor = palette.color(DPalette::TextTips); - frameColor.setAlphaF(0.3); + QColor frameColor = palette.color(DPalette::FrameBorder); + frameColor.setAlphaF(SUMMARY_CHART_LINE_ALPH); painter.setPen(QPen(frameColor, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); painter.setBrush(Qt::NoBrush); diff --git a/deepin-system-monitor-main/gui/dialog/systemprotectionsetting.cpp b/deepin-system-monitor-main/gui/dialog/systemprotectionsetting.cpp index 6cabcc8a..a6d20bd1 100644 --- a/deepin-system-monitor-main/gui/dialog/systemprotectionsetting.cpp +++ b/deepin-system-monitor-main/gui/dialog/systemprotectionsetting.cpp @@ -4,7 +4,8 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "systemprotectionsetting.h" - +#include "helper.hpp" +#include "ddlog.h" #include #include #include @@ -28,11 +29,11 @@ #include #ifndef AlarmStatusOptionName -#define AlarmStatusOptionName "setting.systemprotection.alarm_switch" -#define AlarmCpuUsageOptionName "setting.systemprotection.alarm_cpu_usage" -#define AlarmMemUsageOptionName "setting.systemprotection.alarm_memory_usage" -#define AlarmIntervalOptionName "setting.systemprotection.alarm_interval" -#define AlarmLastTimeOptionName "setting.systemprotection.alarm_last_time" +# define AlarmStatusOptionName "setting.systemprotection.alarm_switch" +# define AlarmCpuUsageOptionName "setting.systemprotection.alarm_cpu_usage" +# define AlarmMemUsageOptionName "setting.systemprotection.alarm_memory_usage" +# define AlarmIntervalOptionName "setting.systemprotection.alarm_interval" +# define AlarmLastTimeOptionName "setting.systemprotection.alarm_last_time" #endif // 与系统字体大小的偏移值,-1.5为小于系统字体大小1.5字号 @@ -41,10 +42,8 @@ int SystemProtectionSetting::m_lastValidCPUValue = 0; int SystemProtectionSetting::m_lastValidMemoryValue = 0; int SystemProtectionSetting::m_lastValidInternalValue = 0; - - Q_GLOBAL_STATIC(SystemProtectionSetting, theInstance) - +using namespace DDLog; // 修改控件字体大小 bool changeWidgetFontSizeByDiffWithSystem(QWidget *widget, double diff) { @@ -54,9 +53,10 @@ bool changeWidgetFontSizeByDiffWithSystem(QWidget *widget, double diff) } // 获取系统字体大小设置 - QDBusInterface interface("com.deepin.daemon.Appearance", - "/com/deepin/daemon/Appearance", - "com.deepin.daemon.Appearance"); + + QDBusInterface interface(common::systemInfo().AppearanceService, + common::systemInfo().AppearancePath, + common::systemInfo().AppearanceInterface); // 获取失败,返回 if (interface.isValid() == false) { return false; @@ -81,12 +81,7 @@ bool changeWidgetFontSizeByDiffWithSystem(QWidget *widget, double diff) } SystemProtectionSetting::SystemProtectionSetting(QObject *parent) - : QObject(parent) - , mBackend(nullptr) - , mDsettings(nullptr) - , mDaemonInterface("org.deepin.SystemMonitorDaemon", - "/org/deepin/SystemMonitorDaemon", - "org.deepin.SystemMonitorDaemon") + : QObject(parent), mBackend(nullptr), mDsettings(nullptr), mDaemonInterface("org.deepin.SystemMonitorDaemon", "/org/deepin/SystemMonitorDaemon", "org.deepin.SystemMonitorDaemon") { mDaemonInterface.setParent(this); // json文件加载setting基本结构 @@ -135,8 +130,8 @@ QPair SystemProtectionSetting::createSettingLinkButtonHand // 获取初始值 option->setValue(option->defaultValue()); - option->connect(button, &DCommandLinkButton::clicked, option, [ = ]() { - qDebug() << __FUNCTION__ << __LINE__ << ",will jump to dde setting center notification page!"; + option->connect(button, &DCommandLinkButton::clicked, option, [=]() { + qCDebug(app) << __FUNCTION__ << __LINE__ << ",will jump to dde setting center notification page!"; SystemProtectionSetting::instance()->onMessgaeSetting(""); }); if (widget != nullptr) @@ -169,15 +164,15 @@ QPair SystemProtectionSetting::createProtectionSwitchHandl QPair optionWidget = DSettingsWidgetFactory::createStandardItem(QByteArray(), option, widget); // Item操作修改Setting值 - option->connect(button, &DSwitchButton::clicked, option, [ = ](bool checked) { - qDebug() << __FUNCTION__ << __LINE__ << ", new protection swich :" << checked; + option->connect(button, &DSwitchButton::clicked, option, [=](bool checked) { + qCDebug(app) << __FUNCTION__ << __LINE__ << ", new protection swich :" << checked; if (checked != option->value().toBool()) { option->setValue(checked); } }); // 用于恢复默认时,Item的数据更新 - button->connect(option, &DSettingsOption::valueChanged, button, [ = ]() { + button->connect(option, &DSettingsOption::valueChanged, button, [=]() { if (option->value().toBool() != button->isChecked()) { button->setChecked(option->value().toBool()); } @@ -202,7 +197,6 @@ void SystemProtectionSetting::setLastValidAlarm(DLineEdit *lineEdit, DTK_CORE_NA else if (option->key() == AlarmIntervalOptionName) lineEdit->setText(QString::number(m_lastValidInternalValue)); } - } void SystemProtectionSetting::lineEditChanged(bool focus, DLineEdit *edit, DSettingsOption *option, int maxValue, int minValue) @@ -231,7 +225,7 @@ void SystemProtectionSetting::lineEditChanged(bool focus, DLineEdit *edit, DSett option->setValue(m_lastValidInternalValue); } } -// SystemProtectionSetting::instance()->regularNumber(edit); + // SystemProtectionSetting::instance()->regularNumber(edit); } QPair SystemProtectionSetting::createAlarmUsgaeSettingHandle(QObject *obj) @@ -256,7 +250,7 @@ QPair SystemProtectionSetting::createAlarmUsgaeSettingHand edit->lineEdit()->setValidator(validator); // 规范输入的文字信息(数字) -// SystemProtectionSetting::instance()->regularNumber(edit); + // SystemProtectionSetting::instance()->regularNumber(edit); // 构建提示语 DLabel *label = new DLabel(widget); @@ -285,29 +279,29 @@ QPair SystemProtectionSetting::createAlarmUsgaeSettingHand m_lastValidMemoryValue = option->value().toInt(); // 修改Item同步修改Setting数据 - option->connect(edit, &DLineEdit::focusChanged, option, [ = ](bool onFocus) { + option->connect(edit, &DLineEdit::focusChanged, option, [=](bool onFocus) { lineEditChanged(onFocus, edit, option, 100, 30); }); - option->connect(edit, &DLineEdit::textChanged, option, [ = ]() { + option->connect(edit, &DLineEdit::textChanged, option, [=]() { QString text = edit->text(); int number = text.toInt(); edit->setText(QString::number(number)); }); - option->connect(edit, &DLineEdit::returnPressed, option, [ = ]() { + option->connect(edit, &DLineEdit::returnPressed, option, [=]() { lineEditChanged(false, edit, option, 100, 30); }); // 用于恢复默认时,Item的数据更新 - edit->connect(option, &DSettingsOption::valueChanged, edit, [ = ]() { + edit->connect(option, &DSettingsOption::valueChanged, edit, [=]() { if (option->value().toInt() != edit->text().toInt()) { edit->setText(option->value().toString()); // 恢复默认时,需要更新默认设置值 if (option->key() == AlarmCpuUsageOptionName) - m_lastValidCPUValue = option->value().toInt(); + m_lastValidCPUValue = option->value().toInt(); if (option->key() == AlarmMemUsageOptionName) - m_lastValidMemoryValue = option->value().toInt(); + m_lastValidMemoryValue = option->value().toInt(); } }); @@ -322,7 +316,7 @@ QPair SystemProtectionSetting::createAlarmUsgaeSettingHand // 初始控件的disable状态 widget->setDisabled(!swtich_value.toBool()); // 连接监控开关变化信号 - widget->connect(settingPtr, &DSettings::valueChanged, widget, [ = ](const QString & key, const QVariant & value) { + widget->connect(settingPtr, &DSettings::valueChanged, widget, [=](const QString &key, const QVariant &value) { if (key == AlarmStatusOptionName) { widget->setDisabled(!value.toBool()); } @@ -332,7 +326,7 @@ QPair SystemProtectionSetting::createAlarmUsgaeSettingHand // 初始控件的disable状态 leftWidget->setDisabled(!swtich_value.toBool()); // 连接监控开关变化信号 - leftWidget->connect(settingPtr, &DSettings::valueChanged, leftWidget, [ = ](const QString & key, const QVariant & value) { + leftWidget->connect(settingPtr, &DSettings::valueChanged, leftWidget, [=](const QString &key, const QVariant &value) { if (key == AlarmStatusOptionName) { leftWidget->setDisabled(!value.toBool()); } @@ -367,7 +361,7 @@ QPair SystemProtectionSetting::createAlarmIntervalSettingH edit->lineEdit()->setValidator(validator); // 规范输入的文字信息(数字) -// SystemProtectionSetting::instance()->regularNumber(edit); + // SystemProtectionSetting::instance()->regularNumber(edit); // 构建提示语 DLabel *label = new DLabel(widget); @@ -393,26 +387,26 @@ QPair SystemProtectionSetting::createAlarmIntervalSettingH // 获取初始值时同步更新静态变量 m_lastValidInternalValue = option->value().toInt(); // 修改Item同步修改Setting数据 - option->connect(edit, &DLineEdit::focusChanged, option, [ = ](bool onFocus) { + option->connect(edit, &DLineEdit::focusChanged, option, [=](bool onFocus) { lineEditChanged(onFocus, edit, option, 60, 5); }); - option->connect(edit, &DLineEdit::textChanged, option, [ = ]() { + option->connect(edit, &DLineEdit::textChanged, option, [=]() { QString text = edit->text(); int number = text.toInt(); edit->setText(QString::number(number)); }); - option->connect(edit, &DLineEdit::returnPressed, option, [ = ]() { + option->connect(edit, &DLineEdit::returnPressed, option, [=]() { lineEditChanged(false, edit, option, 60, 5); }); // 用于恢复默认时,Item的数据更新 - edit->connect(option, &DSettingsOption::valueChanged, edit, [ = ]() { + edit->connect(option, &DSettingsOption::valueChanged, edit, [=]() { if (option->value().toInt() != edit->text().toInt()) { edit->setText(option->value().toString()); if (option->key() == AlarmIntervalOptionName) - m_lastValidInternalValue = option->value().toInt(); + m_lastValidInternalValue = option->value().toInt(); } }); @@ -427,7 +421,7 @@ QPair SystemProtectionSetting::createAlarmIntervalSettingH // 初始控件的disable状态 widget->setDisabled(!swtich_value.toBool()); // 连接监控开关变化信号 - widget->connect(settingPtr, &DSettings::valueChanged, widget, [ = ](const QString & key, const QVariant & value) { + widget->connect(settingPtr, &DSettings::valueChanged, widget, [=](const QString &key, const QVariant &value) { if (key == AlarmStatusOptionName) { widget->setDisabled(!value.toBool()); } @@ -437,7 +431,7 @@ QPair SystemProtectionSetting::createAlarmIntervalSettingH // 初始控件的disable状态 leftWidget->setDisabled(!swtich_value.toBool()); // 连接监控开关变化信号 - leftWidget->connect(settingPtr, &DSettings::valueChanged, leftWidget, [ = ](const QString & key, const QVariant & value) { + leftWidget->connect(settingPtr, &DSettings::valueChanged, leftWidget, [=](const QString &key, const QVariant &value) { if (key == AlarmStatusOptionName) { leftWidget->setDisabled(!value.toBool()); } @@ -475,29 +469,44 @@ void SystemProtectionSetting::onMessgaeSetting(QVariant value) if (genericName.isEmpty() == false) { // 跳转到设置页并指定Item - QDBusMessage showDDEControlCenterPage = QDBusMessage::createMethodCall("com.deepin.dde.ControlCenter", - "/com/deepin/dde/ControlCenter", - "com.deepin.dde.ControlCenter", + QDBusMessage showDDEControlCenterPage = QDBusMessage::createMethodCall(common::systemInfo().ControlCenterService, + common::systemInfo().ControlCenterPath, + common::systemInfo().ControlCenterInterface, "ShowPage"); QList args; - args.append("notification"); - args.append(genericName); + if (!common::systemInfo().isOldVersion()) { + args << QString("notification/%1").append(genericName); + } else { + args.append("notification"); + args.append(genericName); + } + showDDEControlCenterPage.setArguments(args); QDBusMessage replyMsg = QDBusConnection::sessionBus().call(showDDEControlCenterPage); if (replyMsg.type() == QDBusMessage::ErrorMessage) { - qWarning() << __FUNCTION__ << __LINE__ << ", dde control center dbus method call fail , error name :" + qCWarning(app) << __FUNCTION__ << __LINE__ << ", dde control center dbus method call fail , error name :" << replyMsg.errorName() << " , error msg :" << replyMsg.errorMessage(); } } else { // 跳转到设置页 - // qdbus com.deepin.dde.ControlCenter /com/deepin/dde/ControlCenter com.deepin.dde.ControlCenter.ShowModule notification - QDBusMessage showDDEControlCenter = QDBusMessage::createMethodCall("com.deepin.dde.ControlCenter", - "/com/deepin/dde/ControlCenter", - "com.deepin.dde.ControlCenter", - "ShowModule"); + // qdbus org.deepin.dde.ControlCenter1 /org/deepin/dde/ControlCenter1 org.deepin.dde.ControlCenter1.ShowModule notification + + QDBusMessage showDDEControlCenter; + if (!common::systemInfo().isOldVersion()) { + showDDEControlCenter = QDBusMessage::createMethodCall(common::systemInfo().ControlCenterService, + common::systemInfo().ControlCenterPath, + common::systemInfo().ControlCenterInterface, + "ShowPage"); + } else { + showDDEControlCenter = QDBusMessage::createMethodCall("com.deepin.dde.ControlCenter", + "/com/deepin/dde/ControlCenter", + "com.deepin.dde.ControlCenter", + "ShowModule"); + } + QList args; args << "notification"; showDDEControlCenter.setArguments(args); @@ -505,7 +514,7 @@ void SystemProtectionSetting::onMessgaeSetting(QVariant value) QDBusMessage replyMsg = QDBusConnection::sessionBus().call(showDDEControlCenter); if (replyMsg.type() == QDBusMessage::ErrorMessage) { - qWarning() << __FUNCTION__ << __LINE__ << ", dde control center dbus method call fail , error name :" + qCWarning(app) << __FUNCTION__ << __LINE__ << ", dde control center dbus method call fail , error name :" << replyMsg.errorName() << " , error msg :" << replyMsg.errorMessage(); } } @@ -513,7 +522,7 @@ void SystemProtectionSetting::onMessgaeSetting(QVariant value) void SystemProtectionSetting::onSettingItemChanged(const QString &key, const QVariant &value) { - qDebug() << __FUNCTION__ << __LINE__ << ", key:" << key << ", value:" << value; + qCDebug(app) << __FUNCTION__ << __LINE__ << ", key:" << key << ", value:" << value; // 使用QProcess执行dbus操作, 此操作是为了通知daemon进程,监测功能设置数据更改 // 在执行 DSettingsDialog "恢复默认"按钮操作时,QDBusInterFace QDBusConnection 等操作会发生调用错误 // 错误提示 org.freedesktop.DBus.Error.UnknownMethod @@ -526,30 +535,30 @@ void SystemProtectionSetting::onSettingItemChanged(const QString &key, const QVa // 拼接dbus调用命令字串 if (key == AlarmStatusOptionName) { - cmd.append("setSystemProtectionStatus "); // Method Name - cmd.append(value.toString()); // value + cmd.append("setSystemProtectionStatus "); // Method Name + cmd.append(value.toString()); // value needCall = true; } else if (key == AlarmCpuUsageOptionName) { - cmd.append("setAlarmUsageOfCpu "); // Method Name - cmd.append(value.toString()); // value + cmd.append("setAlarmUsageOfCpu "); // Method Name + cmd.append(value.toString()); // value needCall = true; } else if (key == AlarmMemUsageOptionName) { - cmd.append("setAlarmUsageOfMemory "); // Method Name - cmd.append(value.toString()); // value + cmd.append("setAlarmUsageOfMemory "); // Method Name + cmd.append(value.toString()); // value needCall = true; } else if (key == AlarmIntervalOptionName) { - cmd.append("setAlarmMsgInterval "); // Method Name - cmd.append(value.toString()); // value + cmd.append("setAlarmMsgInterval "); // Method Name + cmd.append(value.toString()); // value needCall = true; } else if (key == AlarmLastTimeOptionName) { - cmd.append("setAlarmLastTimeInterval "); // Mehthod Name + cmd.append("setAlarmLastTimeInterval "); // Mehthod Name cmd.append(value.toString()); needCall = true; } - if (needCall) { - qDebug() << __FUNCTION__ << __LINE__ << ",dbus cmd:" << cmd; - QTimer::singleShot(100, this, [ = ]() { QProcess::startDetached(cmd); }); + if (needCall) { + qCDebug(app) << __FUNCTION__ << __LINE__ << ",dbus cmd:" << cmd; + QTimer::singleShot(100, this, [=]() { QProcess::startDetached(cmd); }); } } @@ -561,7 +570,7 @@ DSettings *SystemProtectionSetting::getDSettingPointor() void SystemProtectionSetting::regularNumber(DLineEdit *lineEdit) { // 失去焦点时 - connect(lineEdit, &DLineEdit::focusChanged, SystemProtectionSetting::instance(), [ = ]() { + connect(lineEdit, &DLineEdit::focusChanged, SystemProtectionSetting::instance(), [=]() { if (lineEdit) { QString text = lineEdit->text(); int number = text.toInt(); @@ -570,7 +579,7 @@ void SystemProtectionSetting::regularNumber(DLineEdit *lineEdit) }); // 回车按下时 - connect(lineEdit, &DLineEdit::returnPressed, SystemProtectionSetting::instance(), [ = ]() { + connect(lineEdit, &DLineEdit::returnPressed, SystemProtectionSetting::instance(), [=]() { if (lineEdit) { QString text = lineEdit->text(); int number = text.toInt(); @@ -583,9 +592,9 @@ void SystemProtectionSetting::onUpdateNewBackend() { // 创建新的数据后端,应对可能的设置数据变化 QString strConfigPath = QString("%1/%2/%3/protection.conf") - .arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)) - .arg(qApp->organizationName()) - .arg(qApp->applicationName()); + .arg(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)) + .arg(qApp->organizationName()) + .arg(qApp->applicationName()); Dtk::Core::QSettingBackend *newBackend = new QSettingBackend(strConfigPath); // 为DSetting更新数据后端 diff --git a/deepin-system-monitor-main/gui/main_window.cpp b/deepin-system-monitor-main/gui/main_window.cpp index 3958bf7b..022f8d5e 100644 --- a/deepin-system-monitor-main/gui/main_window.cpp +++ b/deepin-system-monitor-main/gui/main_window.cpp @@ -1,7 +1,7 @@ // SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later - +#include "ddlog.h" #include "main_window.h" #include "user_page_widget.h" #include "application.h" @@ -20,7 +20,7 @@ #include #include #ifdef DTKCORE_CLASS_DConfigFile -#include +# include #endif #include #include @@ -30,6 +30,7 @@ using namespace core::process; using namespace common::init; +using namespace DDLog; const int WINDOW_MIN_HEIGHT = 760; const int WINDOW_MIN_WIDTH = 1080; @@ -37,8 +38,7 @@ const QString SERVICE_NAME = "com.deepin.SystemMonitorMain"; const QString SERVICE_PATH = "/com/deepin/SystemMonitorMain"; MainWindow::MainWindow(QWidget *parent) - : DMainWindow(parent) - , m_pDbusService(new DBusForSystemoMonitorPluginServce) + : DMainWindow(parent), m_pDbusService(new DBusForSystemoMonitorPluginServce) { m_settings = Settings::instance(); setMinimumSize(WINDOW_MIN_WIDTH, WINDOW_MIN_HEIGHT); @@ -46,9 +46,9 @@ MainWindow::MainWindow(QWidget *parent) connect(this, &MainWindow::loadingStatusChanged, this, &MainWindow::onLoadStatusChanged); #ifdef DTKCORE_CLASS_DConfigFile //需要查询是否支持特殊机型静音恢复,例如hw机型 - DConfig *dconfig = DConfig::create("org.deepin.system-monitor","org.deepin.system-monitor.main"); + DConfig *dconfig = DConfig::create("org.deepin.system-monitor", "org.deepin.system-monitor.main"); //需要判断Dconfig文件是否合法 - if(dconfig && dconfig->isValid() && dconfig->keyList().contains("specialComType")){ + if (dconfig && dconfig->isValid() && dconfig->keyList().contains("specialComType")) { specialComType = dconfig->value("specialComType").toInt(); } #endif @@ -71,10 +71,10 @@ void MainWindow::raiseWindow() void MainWindow::initDisplay() { - QJsonObject obj{ - {"tid", EventLogUtils::Start}, - {"version", QCoreApplication::applicationVersion()}, - {"mode", 1} + QJsonObject obj { + { "tid", EventLogUtils::Start }, + { "version", QCoreApplication::applicationVersion() }, + { "mode", 1 } }; EventLogUtils::get().writeLogs(obj); @@ -115,7 +115,7 @@ void MainWindow::initUI() // control + alt + k killAction->setShortcut(QKeySequence(Qt::CTRL + Qt::ALT + Qt::Key_K)); // emit process kill requested signal if kill process menu item triggered - connect(killAction, &QAction::triggered, this, [ = ]() { Q_EMIT killProcessPerformed(); }); + connect(killAction, &QAction::triggered, this, [=]() { Q_EMIT killProcessPerformed(); }); // display mode menu item DMenu *modeMenu = new DMenu(DApplication::translate("Title.Bar.Context.Menu", "View"), menu); @@ -141,11 +141,11 @@ void MainWindow::initUI() } // emit display mode changed signal if ether expand or compact menu item triggered - connect(expandModeAction, &QAction::triggered, this, [ = ]() { + connect(expandModeAction, &QAction::triggered, this, [=]() { m_settings->setOption(kSettingKeyDisplayMode, kDisplayModeExpand); Q_EMIT displayModeChanged(kDisplayModeExpand); }); - connect(compactModeAction, &QAction::triggered, this, [ = ]() { + connect(compactModeAction, &QAction::triggered, this, [=]() { m_settings->setOption(kSettingKeyDisplayMode, kDisplayModeCompact); Q_EMIT displayModeChanged(kDisplayModeCompact); }); @@ -193,7 +193,7 @@ void MainWindow::initUI() // initialize connections void MainWindow::initConnections() { - connect(m_toolbar, &Toolbar::procTabButtonClicked, this, [ = ]() { + connect(m_toolbar, &Toolbar::procTabButtonClicked, this, [=]() { PERF_PRINT_BEGIN("POINT-05", QString("switch(%1->%2)").arg(DApplication::translate("Title.Bar.Switch", "Services")).arg(DApplication::translate("Title.Bar.Switch", "Processes"))); m_toolbar->clearSearchText(); m_pages->setCurrentWidget(m_procPage); @@ -203,7 +203,7 @@ void MainWindow::initConnections() PERF_PRINT_END("POINT-05"); }); - connect(m_toolbar, &Toolbar::serviceTabButtonClicked, this, [ = ]() { + connect(m_toolbar, &Toolbar::serviceTabButtonClicked, this, [=]() { PERF_PRINT_BEGIN("POINT-05", QString("switch(%1->%2)").arg(DApplication::translate("Title.Bar.Switch", "Processes")).arg(DApplication::translate("Title.Bar.Switch", "Services"))); m_toolbar->clearSearchText(); m_pages->setCurrentWidget(m_svcPage); @@ -212,7 +212,7 @@ void MainWindow::initConnections() m_tbShadow->show(); PERF_PRINT_END("POINT-05"); }); - connect(m_toolbar, &Toolbar::accountProcTabButtonClicked, this, [ = ]() { + connect(m_toolbar, &Toolbar::accountProcTabButtonClicked, this, [=]() { PERF_PRINT_BEGIN("POINT-05", QString("switch(%1->%2)").arg(DApplication::translate("Title.Bar.Switch", "Users")).arg(DApplication::translate("Title.Bar.Switch", "Services"))); m_toolbar->clearSearchText(); m_pages->setCurrentWidget(m_accountProcPage); @@ -221,7 +221,7 @@ void MainWindow::initConnections() m_tbShadow->show(); PERF_PRINT_END("POINT-05"); }); - connect(gApp, &Application::backgroundTaskStateChanged, this, [ = ](Application::TaskState state) { + connect(gApp, &Application::backgroundTaskStateChanged, this, [=](Application::TaskState state) { if (state == Application::kTaskStarted) { // save last focused widget inside main window m_focusedWidget = gApp->mainWindow()->focusWidget(); @@ -242,7 +242,7 @@ void MainWindow::initConnections() if (QDBusConnection::sessionBus().isConnected()) { if (QDBusConnection::sessionBus().registerService(SERVICE_NAME)) { if (!QDBusConnection::sessionBus().registerObject(SERVICE_PATH, m_pDbusService, QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals)) { - qInfo() << "dbus init failed"; + qCInfo(app) << "dbus init failed"; } } } @@ -335,11 +335,10 @@ void MainWindow::onDetailInfoByDbus(QString msgCode) m_toolbar->clearSearchText(); m_toolbar->setProcessButtonChecked(true); m_pages->setCurrentWidget(m_procPage); -// m_procPage->switchProcessPage(); + // m_procPage->switchProcessPage(); m_tbShadow->raise(); m_tbShadow->show(); } - } void MainWindow::popupSettingsDialog() diff --git a/deepin-system-monitor-main/gui/mem_summary_view_widget.cpp b/deepin-system-monitor-main/gui/mem_summary_view_widget.cpp index f22b980f..227c7685 100644 --- a/deepin-system-monitor-main/gui/mem_summary_view_widget.cpp +++ b/deepin-system-monitor-main/gui/mem_summary_view_widget.cpp @@ -21,6 +21,8 @@ using namespace core::system; using namespace common::format; +#define SUMMARY_CHART_LINE_ALPH 0.13 + class DeailTableModel : public QAbstractTableModel { public: @@ -216,8 +218,8 @@ void MemSummaryViewWidget::paintEvent(QPaintEvent *event) QPainter painter(this->viewport()); painter.setRenderHint(QPainter::Antialiasing, true); const auto &palette = DApplicationHelper::instance()->applicationPalette(); - QColor frameColor = palette.color(DPalette::TextTips); - frameColor.setAlphaF(0.3); + QColor frameColor = palette.color(DPalette::FrameBorder); + frameColor.setAlphaF(SUMMARY_CHART_LINE_ALPH); painter.setPen(QPen(frameColor, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); painter.setBrush(Qt::NoBrush); diff --git a/deepin-system-monitor-main/gui/netif_summary_view_widget.cpp b/deepin-system-monitor-main/gui/netif_summary_view_widget.cpp index c9549087..2dc8cab3 100644 --- a/deepin-system-monitor-main/gui/netif_summary_view_widget.cpp +++ b/deepin-system-monitor-main/gui/netif_summary_view_widget.cpp @@ -13,7 +13,7 @@ using namespace common::format; using namespace common::core; - +#define SUMMARY_CHART_LINE_ALPH 0.13 @@ -103,8 +103,8 @@ void NetifSummaryViewWidget::paintEvent(QPaintEvent *event) QPainter painter(this->viewport()); painter.setRenderHint(QPainter::Antialiasing, true); const auto &palette = DApplicationHelper::instance()->applicationPalette(); - QColor frameColor = palette.color(DPalette::TextTips); - frameColor.setAlphaF(0.3); + QColor frameColor = palette.color(DPalette::FrameBorder); + frameColor.setAlphaF(SUMMARY_CHART_LINE_ALPH); painter.setPen(QPen(frameColor, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); painter.setBrush(Qt::NoBrush); diff --git a/deepin-system-monitor-main/gui/netif_summary_view_widget.h b/deepin-system-monitor-main/gui/netif_summary_view_widget.h index 3c58f1fb..5dd2832a 100644 --- a/deepin-system-monitor-main/gui/netif_summary_view_widget.h +++ b/deepin-system-monitor-main/gui/netif_summary_view_widget.h @@ -36,6 +36,7 @@ using namespace common::core; #define TEXTSPACING 30 // 内容文字间距 DWIDGET_USE_NAMESPACE +#define SUMARY_ROW_BG_ALPH 0.03 /** * @brief Network interface summary view widget @@ -95,9 +96,24 @@ class NetInfoDetailItemDelegate : public QStyledItemDelegate const QStyleOptionViewItem &option, const QModelIndex &index) const { - auto palette = option.palette; - QBrush background = palette.color(DPalette::Active, DPalette::Base); - if (!(index.row() & 1)) background = palette.color(DPalette::Active, DPalette::AlternateBase); + const auto &palette = DApplicationHelper::instance()->applicationPalette(); + QBrush background; + QColor backgroundColor; + if (DApplicationHelper::instance()->themeType() == Dtk::Gui::DGuiApplicationHelper::ColorType::LightType) + { + backgroundColor = QColor(0, 0, 0); + backgroundColor.setAlphaF(0); + if (!(index.row() & 1)) + backgroundColor.setAlphaF(SUMARY_ROW_BG_ALPH); + } + else + { + backgroundColor = QColor(255, 255, 255); + backgroundColor.setAlphaF(0); + if (!(index.row() & 1)) + backgroundColor.setAlphaF(SUMARY_ROW_BG_ALPH); + } + background = backgroundColor; painter->save(); QPainterPath clipPath; @@ -114,6 +130,7 @@ class NetInfoDetailItemDelegate : public QStyledItemDelegate QPen forground; forground.setColor(palette.color(DPalette::Active, DPalette::Text)); + painter->setPen(forground); ShowInfo stInfo = index.data(Qt::UserRole).value(); @@ -157,7 +174,6 @@ class NetInfoDetailItemDelegate : public QStyledItemDelegate painter->drawText(valueRect, Qt::AlignLeft | Qt::AlignVCenter, listValue[i]); } } - } else if (index.column() == 0 && stInfo.eType != ShowInfo::Normal) { // 绘制第1列IPV textRect.setY(textRect.y() + TOPMARGIN); @@ -166,7 +182,6 @@ class NetInfoDetailItemDelegate : public QStyledItemDelegate // 其余左对齐、垂直居中 painter->drawText(textRect, Qt::AlignLeft | Qt::AlignVCenter, index.data(Qt::DisplayRole).toString()); } - } painter->restore(); } diff --git a/deepin-system-monitor-main/gui/process_page_widget.cpp b/deepin-system-monitor-main/gui/process_page_widget.cpp index e0d47858..2772156c 100644 --- a/deepin-system-monitor-main/gui/process_page_widget.cpp +++ b/deepin-system-monitor-main/gui/process_page_widget.cpp @@ -43,13 +43,12 @@ #define NORMAL_PERFORMANCE_CPU_LOADING_TIME 100 #define CPU_FREQUENCY_STANDARD "2.30GHz" - DWIDGET_USE_NAMESPACE using namespace core::process; using namespace common::init; // process context summary text static const char *kProcSummaryTemplateText = - QT_TRANSLATE_NOOP("Process.Summary", "(%1 applications and %2 processes are running)"); + QT_TRANSLATE_NOOP("Process.Summary", "(%1 applications and %2 processes are running)"); // application context text static const char *appText = QT_TRANSLATE_NOOP("Process.Show.Mode", "Applications"); @@ -111,7 +110,7 @@ void ProcessPageWidget::initUI() // process context instance m_procViewMode = new DLabel(tw); - m_procViewMode->setText(DApplication::translate("Process.Show.Mode", appText)); // default text + m_procViewMode->setText(DApplication::translate("Process.Show.Mode", appText)); // default text DFontSizeManager::instance()->bind(m_procViewMode, DFontSizeManager::T7, QFont::Medium); // text aligment m_procViewMode->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); @@ -194,7 +193,7 @@ void ProcessPageWidget::initUI() QHBoxLayout *loadingLayout = new QHBoxLayout(this); loadingLayout->addStretch(); loadingLayout->addWidget(m_spinner, Qt::AlignCenter); - loadingLayout->addWidget(m_loadingLabel, Qt::AlignCenter); + loadingLayout->addWidget(m_loadingLabel, Qt::AlignCenter); loadingLayout->addStretch(); m_spinnerWidget->setLayout(loadingLayout); //loading 和 进程列表 @@ -227,44 +226,44 @@ void ProcessPageWidget::initUI() int index = vindex.toInt(); switch (index) { case kFilterCurrentUser: { -// //打开时也显示loading -// m_loadingAndProcessTB->setCurrentWidget(m_spinnerWidget); + // //打开时也显示loading + // m_loadingAndProcessTB->setCurrentWidget(m_spinnerWidget); // show my process view m_myProcButton->setChecked(true); m_procTable->switchDisplayMode(kFilterCurrentUser); m_procViewMode->setText( - DApplication::translate("Process.Show.Mode", myProcText)); // default text + DApplication::translate("Process.Show.Mode", myProcText)); // default text //记录当前选中按钮 m_procBtnCheckedType = USER_PROCESS; } break; case kNoFilter: { -// //打开时也显示loading -// m_loadingAndProcessTB->setCurrentWidget(m_spinnerWidget); + // //打开时也显示loading + // m_loadingAndProcessTB->setCurrentWidget(m_spinnerWidget); // show all process view m_allProcButton->setChecked(true); m_procTable->switchDisplayMode(kNoFilter); m_procViewMode->setText( - DApplication::translate("Process.Show.Mode", allProcText)); // default text + DApplication::translate("Process.Show.Mode", allProcText)); // default text //记录当前选中按钮 m_procBtnCheckedType = ALL_PROCESSS; } break; default: { -// //打开时也显示loading -// m_loadingAndProcessTB->setCurrentWidget(m_spinnerWidget); + // //打开时也显示loading + // m_loadingAndProcessTB->setCurrentWidget(m_spinnerWidget); // show my application view by default m_appButton->setChecked(true); m_procTable->switchDisplayMode(kFilterApps); m_procViewMode->setText( - DApplication::translate("Process.Show.Mode", appText)); // default text + DApplication::translate("Process.Show.Mode", appText)); // default text //记录当前选中按钮 m_procBtnCheckedType = MY_APPS; } - } // ::switch(index) + } // ::switch(index) connect(m_rightStackView, &DetailViewStackedWidget::currentChanged, this, &ProcessPageWidget::onDetailWidgetChanged); QTimer::singleShot(5, this, SLOT(onLoadLeftDataWidgetDelay())); // this->layout()->setSizeConstraint(QLayout::SetMinAndMaxSize); -// m_loadingAndProcessTB->setCurrentWidget(m_procTable); + // m_loadingAndProcessTB->setCurrentWidget(m_procTable); } void ProcessPageWidget::initConnections() @@ -288,11 +287,12 @@ void ProcessPageWidget::initConnections() // update process summary text when process summary info updated background auto *monitor = ThreadManager::instance()->thread(BaseThread::kSystemMonitorThread)->systemMonitorInstance(); - connect(monitor, &SystemMonitor::statInfoUpdated, this, &ProcessPageWidget::onStatInfoUpdated, Qt::DirectConnection); + // Note: do not update on non-GUI thread. + connect(monitor, &SystemMonitor::appAndProcCountUpdate, this, &ProcessPageWidget::onAppAndProcCountUpdated); auto *dAppHelper = DApplicationHelper::instance(); // change text color dynamically on theme type change, if not do this way, text color wont synchronize with theme type - connect(dAppHelper, &DApplicationHelper::themeTypeChanged, this, [ = ]() { + connect(dAppHelper, &DApplicationHelper::themeTypeChanged, this, [=]() { if (m_procViewMode) { auto palette = DApplicationHelper::instance()->applicationPalette(); palette.setColor(DPalette::Text, palette.color(DPalette::TextTitle)); @@ -390,10 +390,8 @@ void ProcessPageWidget::paintEvent(QPaintEvent *) DPalette palette = dAppHelper->applicationPalette(); QColor bgColor = palette.color(DPalette::Background); -// // 显示0.1s -// QTimer::singleShot(NORMAL_PERFORMANCE_CPU_LOADING_TIME, this, [ = ]() {m_loadingAndProcessTB->setCurrentWidget(m_procTable);}); - - + // // 显示0.1s + // QTimer::singleShot(NORMAL_PERFORMANCE_CPU_LOADING_TIME, this, [ = ]() {m_loadingAndProcessTB->setCurrentWidget(m_procTable);}); } // create application kill preview widget @@ -408,27 +406,10 @@ void ProcessPageWidget::createWindowKiller() &ProcessPageWidget::popupKillConfirmDialog); } -void ProcessPageWidget::onStatInfoUpdated() +void ProcessPageWidget::onAppAndProcCountUpdated(int appCount, int procCount) { - QApplication::processEvents(); const QString &buf = DApplication::translate("Process.Summary", kProcSummaryTemplateText); - - ProcessSet *processSet = ProcessDB::instance()->processSet(); - //记录所有进程数量 - const QList &newpidlst = processSet->getPIDList(); - m_iallProcNum = newpidlst.size(); - int appCount = 0; - for (const auto &pid : newpidlst) { - auto process = processSet->getProcessById(pid); - if (process.appType() == kFilterApps) - appCount++; - } - m_procViewModeSummary->setText(buf.arg(appCount).arg(m_iallProcNum)); - m_model = CPUInfoModel::instance(); - -// CPUPerformance = (m_model->cpuSet()->maxFreq() > CPU_FREQUENCY_STANDARD) ? High : Low; - //qInfo() << m_model->cpuSet()->maxFreq() << (m_model->cpuSet()->maxFreq() > CPU_FREQUENCY_STANDARD) << CPUPerformance; - + m_procViewModeSummary->setText(buf.arg(appCount).arg(procCount)); } // change icon theme when theme changed @@ -488,10 +469,10 @@ void ProcessPageWidget::popupKillConfirmDialog(pid_t pid) dialog.exec(); if (dialog.result() == QMessageBox::Ok) { QString name = m_procTable->getProcessName(pid); - QJsonObject obj{ - {"tid", EventLogUtils::ProcessKilled}, - {"version", QCoreApplication::applicationVersion()}, - {"process_name", name} + QJsonObject obj { + { "tid", EventLogUtils::ProcessKilled }, + { "version", QCoreApplication::applicationVersion() }, + { "process_name", name } }; EventLogUtils::get().writeLogs(obj); @@ -516,7 +497,7 @@ void ProcessPageWidget::onAllProcButtonClicked() //若已选中,再次点击不会加载数据 if (m_procBtnCheckedType != ALL_PROCESSS) { PERF_PRINT_BEGIN("POINT-04", QString("switch(%1->%2)").arg(m_procViewMode->text()).arg(DApplication::translate("Process.Show.Mode", allProcText))); -// m_loadingAndProcessTB->setCurrentWidget(m_spinnerWidget); + // m_loadingAndProcessTB->setCurrentWidget(m_spinnerWidget); m_procViewMode->setText(DApplication::translate("Process.Show.Mode", allProcText)); m_procViewMode->adjustSize(); m_procTable->switchDisplayMode(kNoFilter); @@ -533,11 +514,11 @@ void ProcessPageWidget::onAllProcButtonClicked() void ProcessPageWidget::onUserProcButtonClicked() { -// qInfo() << CPUPerformance << "CPUPerformance"; + // qCInfo(app) << CPUPerformance << "CPUPerformance"; //若已选中,再次点击不会加载数据 if (m_procBtnCheckedType != USER_PROCESS) { PERF_PRINT_BEGIN("POINT-04", QString("switch(%1->%2)").arg(m_procViewMode->text()).arg(DApplication::translate("Process.Show.Mode", myProcText))); -// m_loadingAndProcessTB->setCurrentWidget(m_spinnerWidget); + // m_loadingAndProcessTB->setCurrentWidget(m_spinnerWidget); m_procViewMode->setText(DApplication::translate("Process.Show.Mode", myProcText)); m_procViewMode->adjustSize(); m_procTable->switchDisplayMode(kFilterCurrentUser); @@ -557,7 +538,7 @@ void ProcessPageWidget::onAppButtonClicked() //若已选中,再次点击不会加载数据 if (m_procBtnCheckedType != MY_APPS) { PERF_PRINT_BEGIN("POINT-04", QString("switch(%1->%2)").arg(m_procViewMode->text()).arg(DApplication::translate("Process.Show.Mode", appText))); -// m_loadingAndProcessTB->setCurrentWidget(m_spinnerWidget); + // m_loadingAndProcessTB->setCurrentWidget(m_spinnerWidget); m_procViewMode->setText(DApplication::translate("Process.Show.Mode", appText)); m_procViewMode->adjustSize(); m_procTable->switchDisplayMode(kFilterApps); diff --git a/deepin-system-monitor-main/gui/process_page_widget.h b/deepin-system-monitor-main/gui/process_page_widget.h index 62d3ba19..c222b010 100644 --- a/deepin-system-monitor-main/gui/process_page_widget.h +++ b/deepin-system-monitor-main/gui/process_page_widget.h @@ -107,9 +107,9 @@ private Q_SLOTS: void changeIconTheme(DApplicationHelper::ColorType themeType); /** - * @brief 列表数据刷新 + * @brief 列表数据刷新,更新应用和进程统计 */ - void onStatInfoUpdated(); + void onAppAndProcCountUpdated(int appCount, int procCount); /** * @brief 详情页切换 diff --git a/deepin-system-monitor-main/gui/process_table_view.cpp b/deepin-system-monitor-main/gui/process_table_view.cpp index 70d2ce4b..2806f9c6 100644 --- a/deepin-system-monitor-main/gui/process_table_view.cpp +++ b/deepin-system-monitor-main/gui/process_table_view.cpp @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later - +#include "ddlog.h" #include "process_table_view.h" #include "application.h" @@ -21,6 +21,7 @@ #include "model/process_table_model.h" #include "process/process_db.h" #include "common/eventlogutils.h" +#include "helper.hpp" #include #include @@ -46,16 +47,19 @@ #include #include - +using namespace DDLog; using namespace common::init; // process table view backup setting key const QByteArray header_version = "_1.0.0"; static const char *kSettingsOption_ProcessTableHeaderState = "process_table_header_state"; static const char *kSettingsOption_ProcessTableHeaderStateOfUserMode = "process_table_header_state_user"; +/** + * @brief m_pControlConnection 单例对象的信号连接之后,需要保持只连接一次,避免多次触发信号槽 + */ +static QMetaObject::Connection m_pControlConnection = QMetaObject::Connection(); ProcessTableView::ProcessTableView(DWidget *parent, QString userName) - : BaseTableView(parent) - , m_useModeName(userName) + : BaseTableView(parent), m_useModeName(userName) { // install event filter for table view to handle key events installEventFilter(this); @@ -66,14 +70,11 @@ ProcessTableView::ProcessTableView(DWidget *parent, QString userName) m_proxyModel->setSourceModel(m_model); // setModel must be called before calling loadSettings(); setModel(m_proxyModel); - // load process table view backup settings - bool settingsLoaded = userName.isNull() ? loadSettings(kSettingsOption_ProcessTableHeaderState) : - loadSettings(kSettingsOption_ProcessTableHeaderStateOfUserMode); + bool settingsLoaded = userName.isNull() ? loadSettings(kSettingsOption_ProcessTableHeaderState) : loadSettings(kSettingsOption_ProcessTableHeaderStateOfUserMode); // initialize ui components & connections initUI(settingsLoaded); initConnections(settingsLoaded); - // adjust search result tip label text color dynamically on theme type change onThemeTypeChanged(); connect(DApplicationHelper::instance(), &DApplicationHelper::themeTypeChanged, this, &ProcessTableView::onThemeTypeChanged); @@ -87,7 +88,6 @@ ProcessTableView::ProcessTableView(DWidget *parent, QString userName) m_diskread = m_model->getTotalDiskRead(); m_diskwrite = m_model->getTotalDiskWrite(); } - } // destructor @@ -102,9 +102,6 @@ void ProcessTableView::onThemeTypeChanged() auto palette = DApplicationHelper::instance()->applicationPalette(); palette.setColor(DPalette::Text, palette.color(DPalette::PlaceholderText)); m_notFoundLabel->setPalette(palette); - - palette.setColor(DPalette::Button, palette.color(DPalette::Base)); - header()->setPalette(palette); } QString ProcessTableView::getProcessName(int pid) @@ -126,12 +123,12 @@ bool ProcessTableView::eventFilter(QObject *obj, QEvent *event) if (selectedIndexes().size() > 0) { auto index = selectedIndexes()[0]; auto rect = visualRect(index); - displayProcessTableContextMenu({rect.x() + rect.width() / 2, rect.y() + rect.height() / 2}); + displayProcessTableContextMenu({ rect.x() + rect.width() / 2, rect.y() + rect.height() / 2 }); return true; } } else if (header()->hasFocus()) { // if header view has focus, then show context menu for header view - displayProcessTableHeaderContextMenu({header()->sectionSize(header()->logicalIndexAt(0)) / 2, header()->height() / 2}); + displayProcessTableHeaderContextMenu({ header()->sectionSize(header()->logicalIndexAt(0)) / 2, header()->height() / 2 }); return true; } } @@ -155,7 +152,7 @@ void ProcessTableView::endProcess() "loss.\nAre you sure you want to continue?"); KillProcessConfirmDialog dialog(this); -// dialog.setTitle(title); + // dialog.setTitle(title); dialog.setMessage(description); dialog.addButton(DApplication::translate("Kill.Process.Dialog", "Cancel", "button"), false); dialog.addButton(DApplication::translate("Kill.Process.Dialog", "End", "button"), true, @@ -163,10 +160,10 @@ void ProcessTableView::endProcess() dialog.exec(); if (dialog.result() == QMessageBox::Ok) { Process proc = m_model->getProcess(qvariant_cast(m_selectedPID)); - QJsonObject obj{ - {"tid", EventLogUtils::ProcessKilled}, - {"version", QCoreApplication::applicationVersion()}, - {"process_name", proc.name()} + QJsonObject obj { + { "tid", EventLogUtils::ProcessKilled }, + { "version", QCoreApplication::applicationVersion() }, + { "process_name", proc.name() } }; EventLogUtils::get().writeLogs(obj); @@ -206,12 +203,12 @@ void ProcessTableView::openExecDirWithFM() if (m_selectedPID.isValid()) { pid_t pid = qvariant_cast(m_selectedPID); const Process &proc = ProcessDB::instance()->processSet()->getProcessById(pid); - QString cmdline = proc.cmdlineString(); + QString cmdline = proc.cmdlineString(); if (cmdline.size() > 0) { // Found wine program location if cmdline starts with c://. if (cmdline.startsWith("c:")) { - QString winePrefix = proc.environ().value("WINEPREFIX"); + QString winePrefix = proc.environ().value("WINEPREFIX"); cmdline = cmdline.replace("\\", "/").replace("c:/", "/drive_c/"); const QString &path = QString(winePrefix + cmdline).trimmed(); @@ -228,7 +225,55 @@ void ProcessTableView::openExecDirWithFM() whichProcess.waitForFinished(); QString output(whichProcess.readAllStandardOutput()); - const QString &path = QString(output.split("\n")[0]).trimmed(); + QString path; + if (!common::systemInfo().isOldVersion()) { + path = QString(output.split("\n")[0]).trimmed(); + // 读取persistent目录 + if (path.isEmpty()) { + char nsPath[PATH_MAX] = { 0 }, nsSelfPath[PATH_MAX] = { 0 }; + auto nsSize = readlink(QString("/proc/%1/ns/pid").arg(pid).toStdString().c_str(), nsPath, PATH_MAX); + auto nsSelfSize = readlink(QString("/proc/self/ns/pid").toStdString().c_str(), nsSelfPath, PATH_MAX); + if (nsSize > 0 && nsSelfSize > 0) { + QString nsPathStr(nsPath), nsSelfPathStr(nsSelfPath); + if (nsPathStr != nsSelfPathStr) { + Process preProc = proc, curProc = proc; + int count = 0; + // 100次循环 + while (curProc.name() != "ll-box" && curProc.pid() != 0 && count != 100) { + preProc = curProc; + curProc = ProcessDB::instance()->processSet()->getProcessById(preProc.ppid()); + count++; + } + if (curProc.pid() != 0 || count != 100) { + pid = preProc.pid(); + } + char exePath[PATH_MAX] = { 0 }; + auto exeSize = readlink(QString("/proc/%1/exe").arg(pid).toStdString().c_str(), exePath, PATH_MAX); + if (exeSize > 0) { + QString exeStr(exePath); + QFile file(QString("/proc/%1/mountinfo").arg(pid)); + if (file.open(QIODevice::ReadOnly)) { + QString devStr; + do { + QString line = file.readLine(); + auto works = line.split(" ", QString::SkipEmptyParts); + if (works.size() > 9 && exeStr.startsWith(works[4]) && works[9].startsWith("/dev")) { + devStr = works[9]; + if (!devStr.isEmpty()) { + path = "/persistent" + works[3] + exeStr.right(exeStr.size() - works[4].size()); + } + break; + } + } while (!file.atEnd()); + file.close(); + } + } + } + } + } + } else { + path = QString(output.split("\n")[0]).trimmed(); + } common::openFilePathItem(path); } // Find flatpak application location. @@ -250,8 +295,8 @@ void ProcessTableView::openExecDirWithFM() } } } - } // ::if(cmdline) - } // ::if(selectedPID) + } // ::if(cmdline) + } // ::if(selectedPID) } // show process attribute dialog @@ -296,10 +341,10 @@ void ProcessTableView::killProcess() dialog.exec(); if (dialog.result() == QMessageBox::Ok) { Process proc = m_model->getProcess(qvariant_cast(m_selectedPID)); - QJsonObject obj{ - {"tid", EventLogUtils::ProcessKilled}, - {"version", QCoreApplication::applicationVersion()}, - {"process_name", proc.name()} + QJsonObject obj { + { "tid", EventLogUtils::ProcessKilled }, + { "version", QCoreApplication::applicationVersion() }, + { "process_name", proc.name() } }; EventLogUtils::get().writeLogs(obj); ProcessDB::instance()->killProcess(qvariant_cast(m_selectedPID)); @@ -322,7 +367,6 @@ void ProcessTableView::switchDisplayMode(FilterType type) { m_proxyModel->setFilterType(type); - } // change process priority @@ -394,23 +438,23 @@ void ProcessTableView::initUI(bool settingsLoaded) palette.setColor(DPalette::Text, labelColor); m_notFoundLabel->setPalette(palette); m_notFoundLabel->setVisible(false); - // header view options + // header view instance + auto *hdr = header(); // header section movable - header()->setSectionsMovable(true); + hdr->setSectionsMovable(true); // header section clickable - header()->setSectionsClickable(true); + hdr->setSectionsClickable(true); // header section resizable - header()->setSectionResizeMode(DHeaderView::Interactive); + hdr->setSectionResizeMode(DHeaderView::Interactive); // stretch last header section - header()->setStretchLastSection(true); + hdr->setStretchLastSection(true); // show sort indicator on sort column - header()->setSortIndicatorShown(true); + hdr->setSortIndicatorShown(true); // header section default alignment - header()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter); + hdr->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter); // header section context menu policy - header()->setContextMenuPolicy(Qt::CustomContextMenu); - + hdr->setContextMenuPolicy(Qt::CustomContextMenu); // table options setSortingEnabled(true); // only single row selection allowed @@ -495,96 +539,96 @@ void ProcessTableView::initConnections(bool settingsLoaded) &ProcessTableView::displayProcessTableContextMenu); // end process auto *endProcAction = m_contextMenu->addAction( - DApplication::translate("Process.Table.Context.Menu", "End process")); + DApplication::translate("Process.Table.Context.Menu", "End process")); // ALT + E endProcAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_E)); connect(endProcAction, &QAction::triggered, this, &ProcessTableView::endProcess); // pause process auto *pauseProcAction = m_contextMenu->addAction( - DApplication::translate("Process.Table.Context.Menu", "Suspend process")); + DApplication::translate("Process.Table.Context.Menu", "Suspend process")); // ALT + P pauseProcAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_P)); connect(pauseProcAction, &QAction::triggered, this, &ProcessTableView::pauseProcess); // resume process auto *resumeProcAction = m_contextMenu->addAction( - DApplication::translate("Process.Table.Context.Menu", "Resume process")); + DApplication::translate("Process.Table.Context.Menu", "Resume process")); // ALT + C resumeProcAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_C)); connect(resumeProcAction, &QAction::triggered, this, &ProcessTableView::resumeProcess); // change priority dialog auto *chgProcPrioMenu = m_contextMenu->addMenu( - DApplication::translate("Process.Table.Context.Menu", "Change priority")); + DApplication::translate("Process.Table.Context.Menu", "Change priority")); QActionGroup *prioGroup = new QActionGroup(chgProcPrioMenu); prioGroup->setExclusive(true); // very high priority action auto *setVeryHighPrioAction = - chgProcPrioMenu->addAction(DApplication::translate("Process.Priority", "Very high")); + chgProcPrioMenu->addAction(DApplication::translate("Process.Priority", "Very high")); setVeryHighPrioAction->setCheckable(true); setVeryHighPrioAction->setActionGroup(prioGroup); connect(setVeryHighPrioAction, &QAction::triggered, - [ = ]() { changeProcessPriority(kVeryHighPriority); }); + [=]() { changeProcessPriority(kVeryHighPriority); }); // high priority action auto *setHighPrioAction = - chgProcPrioMenu->addAction(DApplication::translate("Process.Priority", "High")); + chgProcPrioMenu->addAction(DApplication::translate("Process.Priority", "High")); setHighPrioAction->setCheckable(true); setHighPrioAction->setActionGroup(prioGroup); connect(setHighPrioAction, &QAction::triggered, - [ = ]() { changeProcessPriority(kHighPriority); }); + [=]() { changeProcessPriority(kHighPriority); }); // normal priority action auto *setNormalPrioAction = - chgProcPrioMenu->addAction(DApplication::translate("Process.Priority", "Normal")); + chgProcPrioMenu->addAction(DApplication::translate("Process.Priority", "Normal")); setNormalPrioAction->setCheckable(true); setNormalPrioAction->setActionGroup(prioGroup); connect(setNormalPrioAction, &QAction::triggered, - [ = ]() { changeProcessPriority(kNormalPriority); }); + [=]() { changeProcessPriority(kNormalPriority); }); // low priority action auto *setLowPrioAction = - chgProcPrioMenu->addAction(DApplication::translate("Process.Priority", "Low")); + chgProcPrioMenu->addAction(DApplication::translate("Process.Priority", "Low")); setLowPrioAction->setCheckable(true); setLowPrioAction->setActionGroup(prioGroup); connect(setLowPrioAction, &QAction::triggered, - [ = ]() { changeProcessPriority(kLowPriority); }); + [=]() { changeProcessPriority(kLowPriority); }); // very low priority action auto *setVeryLowPrioAction = - chgProcPrioMenu->addAction(DApplication::translate("Process.Priority", "Very low")); + chgProcPrioMenu->addAction(DApplication::translate("Process.Priority", "Very low")); setVeryLowPrioAction->setCheckable(true); setVeryLowPrioAction->setActionGroup(prioGroup); connect(setVeryLowPrioAction, &QAction::triggered, - [ = ]() { changeProcessPriority(kVeryLowPriority); }); + [=]() { changeProcessPriority(kVeryLowPriority); }); // custom priority action auto *setCustomPrioAction = - chgProcPrioMenu->addAction(DApplication::translate("Process.Priority", "Custom")); + chgProcPrioMenu->addAction(DApplication::translate("Process.Priority", "Custom")); setCustomPrioAction->setCheckable(true); setCustomPrioAction->setActionGroup(prioGroup); - connect(setCustomPrioAction, &QAction::triggered, [ = ]() { customizeProcessPriority(); }); + connect(setCustomPrioAction, &QAction::triggered, [=]() { customizeProcessPriority(); }); // show exec location action auto *openExecDirAction = m_contextMenu->addAction( - DApplication::translate("Process.Table.Context.Menu", "View command location")); + DApplication::translate("Process.Table.Context.Menu", "View command location")); connect(openExecDirAction, &QAction::triggered, this, &ProcessTableView::openExecDirWithFM); // show property action auto *showAttrAction = m_contextMenu->addAction( - DApplication::translate("Process.Table.Context.Menu", "Properties")); + DApplication::translate("Process.Table.Context.Menu", "Properties")); // ALt + ENTER showAttrAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_Enter)); connect(showAttrAction, &QAction::triggered, this, &ProcessTableView::showProperties); m_contextMenu->addSeparator(); // kill process auto *killProcAction = m_contextMenu->addAction( - DApplication::translate("Process.Table.Context.Menu", "Kill process")); + DApplication::translate("Process.Table.Context.Menu", "Kill process")); // ALT + K killProcAction->setShortcut(QKeySequence(Qt::ALT + Qt::Key_K)); connect(killProcAction, &QAction::triggered, this, &ProcessTableView::killProcess); // change menu item checkable state before context menu popup - connect(m_contextMenu, &DMenu::aboutToShow, this, [ = ]() { + connect(m_contextMenu, &DMenu::aboutToShow, this, [=]() { // process running or not flag if (m_selectedPID.isValid()) { @@ -633,16 +677,16 @@ void ProcessTableView::initConnections(bool settingsLoaded) // backup table view settings if any of the header view state changes auto *h = header(); - connect(h, &QHeaderView::sectionResized, this, [ = ]() { saveSettings(); }); - connect(h, &QHeaderView::sectionMoved, this, [ = ]() { saveSettings(); }); - connect(h, &QHeaderView::sortIndicatorChanged, this, [ = ]() { saveSettings(); }); + connect(h, &QHeaderView::sectionResized, this, [=]() { saveSettings(); }); + connect(h, &QHeaderView::sectionMoved, this, [=]() { saveSettings(); }); + connect(h, &QHeaderView::sortIndicatorChanged, this, [=]() { saveSettings(); }); connect(h, &QHeaderView::customContextMenuRequested, this, &ProcessTableView::displayProcessTableHeaderContextMenu); // header context menu // cpu action auto *cpuHeaderAction = m_headerContextMenu->addAction( - DApplication::translate("Process.Table.Header", kProcessCPU)); + DApplication::translate("Process.Table.Header", kProcessCPU)); cpuHeaderAction->setCheckable(true); connect(cpuHeaderAction, &QAction::triggered, this, [this](bool b) { header()->setSectionHidden(ProcessTableModel::kProcessCPUColumn, !b); @@ -651,7 +695,7 @@ void ProcessTableView::initConnections(bool settingsLoaded) }); // process user action auto *userHeaderAction = m_headerContextMenu->addAction( - DApplication::translate("Process.Table.Header", kProcessUser)); + DApplication::translate("Process.Table.Header", kProcessUser)); userHeaderAction->setCheckable(true); connect(userHeaderAction, &QAction::triggered, this, [this](bool b) { header()->setSectionHidden(ProcessTableModel::kProcessUserColumn, !b); @@ -659,7 +703,7 @@ void ProcessTableView::initConnections(bool settingsLoaded) }); // memory action auto *memHeaderAction = m_headerContextMenu->addAction( - DApplication::translate("Process.Table.Header", kProcessMemory)); + DApplication::translate("Process.Table.Header", kProcessMemory)); memHeaderAction->setCheckable(true); connect(memHeaderAction, &QAction::triggered, this, [this](bool b) { header()->setSectionHidden(ProcessTableModel::kProcessMemoryColumn, !b); @@ -668,7 +712,7 @@ void ProcessTableView::initConnections(bool settingsLoaded) }); // share memory action auto *sharememHeaderAction = m_headerContextMenu->addAction( - DApplication::translate("Process.Table.Header", kProcessShareMemory)); + DApplication::translate("Process.Table.Header", kProcessShareMemory)); sharememHeaderAction->setCheckable(true); connect(sharememHeaderAction, &QAction::triggered, this, [this](bool b) { header()->setSectionHidden(ProcessTableModel::kProcessShareMemoryColumn, !b); @@ -677,7 +721,7 @@ void ProcessTableView::initConnections(bool settingsLoaded) }); //vtr memory action auto *vtrmemHeaderAction = m_headerContextMenu->addAction( - DApplication::translate("Process.Table.Header", kProcessVtrMemory)); + DApplication::translate("Process.Table.Header", kProcessVtrMemory)); vtrmemHeaderAction->setCheckable(true); connect(vtrmemHeaderAction, &QAction::triggered, this, [this](bool b) { header()->setSectionHidden(ProcessTableModel::kProcessVTRMemoryColumn, !b); @@ -686,7 +730,7 @@ void ProcessTableView::initConnections(bool settingsLoaded) }); // upload rate action auto *uploadHeaderAction = m_headerContextMenu->addAction( - DApplication::translate("Process.Table.Header", kProcessUpload)); + DApplication::translate("Process.Table.Header", kProcessUpload)); uploadHeaderAction->setCheckable(true); connect(uploadHeaderAction, &QAction::triggered, this, [this](bool b) { header()->setSectionHidden(ProcessTableModel::kProcessUploadColumn, !b); @@ -695,7 +739,7 @@ void ProcessTableView::initConnections(bool settingsLoaded) }); // download rate action auto *downloadHeaderAction = m_headerContextMenu->addAction( - DApplication::translate("Process.Table.Header", kProcessDownload)); + DApplication::translate("Process.Table.Header", kProcessDownload)); downloadHeaderAction->setCheckable(true); connect(downloadHeaderAction, &QAction::triggered, this, [this](bool b) { header()->setSectionHidden(ProcessTableModel::kProcessDownloadColumn, !b); @@ -704,7 +748,7 @@ void ProcessTableView::initConnections(bool settingsLoaded) }); // disk read rate action auto *dreadHeaderAction = m_headerContextMenu->addAction( - DApplication::translate("Process.Table.Header", kProcessDiskRead)); + DApplication::translate("Process.Table.Header", kProcessDiskRead)); dreadHeaderAction->setCheckable(true); connect(dreadHeaderAction, &QAction::triggered, this, [this](bool b) { header()->setSectionHidden(ProcessTableModel::kProcessDiskReadColumn, !b); @@ -713,7 +757,7 @@ void ProcessTableView::initConnections(bool settingsLoaded) }); // disk write rate action auto *dwriteHeaderAction = m_headerContextMenu->addAction( - DApplication::translate("Process.Table.Header", kProcessDiskWrite)); + DApplication::translate("Process.Table.Header", kProcessDiskWrite)); dwriteHeaderAction->setCheckable(true); connect(dwriteHeaderAction, &QAction::triggered, this, [this](bool b) { header()->setSectionHidden(ProcessTableModel::kProcessDiskWriteColumn, !b); @@ -722,7 +766,7 @@ void ProcessTableView::initConnections(bool settingsLoaded) }); // pid action auto *pidHeaderAction = m_headerContextMenu->addAction( - DApplication::translate("Process.Table.Header", kProcessPID)); + DApplication::translate("Process.Table.Header", kProcessPID)); pidHeaderAction->setCheckable(true); connect(pidHeaderAction, &QAction::triggered, this, [this](bool b) { header()->setSectionHidden(ProcessTableModel::kProcessPIDColumn, !b); @@ -730,7 +774,7 @@ void ProcessTableView::initConnections(bool settingsLoaded) }); // nice value action auto *niceHeaderAction = m_headerContextMenu->addAction( - DApplication::translate("Process.Table.Header", kProcessNice)); + DApplication::translate("Process.Table.Header", kProcessNice)); niceHeaderAction->setCheckable(true); connect(niceHeaderAction, &QAction::triggered, this, [this](bool b) { header()->setSectionHidden(ProcessTableModel::kProcessNiceColumn, !b); @@ -738,7 +782,7 @@ void ProcessTableView::initConnections(bool settingsLoaded) }); // priority value action auto *priorityHeaderAction = m_headerContextMenu->addAction( - DApplication::translate("Process.Table.Header", kProcessPriority)); + DApplication::translate("Process.Table.Header", kProcessPriority)); priorityHeaderAction->setCheckable(true); connect(priorityHeaderAction, &QAction::triggered, this, [this](bool b) { header()->setSectionHidden(ProcessTableModel::kProcessPriorityColumn, !b); @@ -760,7 +804,7 @@ void ProcessTableView::initConnections(bool settingsLoaded) priorityHeaderAction->setChecked(true); } // set header context menu checkable state based on current header section's visible state before popup - connect(m_headerContextMenu, &QMenu::aboutToShow, this, [ = ]() { + connect(m_headerContextMenu, &QMenu::aboutToShow, this, [=]() { bool b; b = header()->isSectionHidden(ProcessTableModel::kProcessCPUColumn); cpuHeaderAction->setChecked(!b); @@ -794,7 +838,8 @@ void ProcessTableView::initConnections(bool settingsLoaded) if (m_selectedPID.isValid()) { for (int i = 0; i < m_proxyModel->rowCount(); i++) { if (m_proxyModel->data(m_proxyModel->index(i, ProcessTableModel::kProcessPIDColumn), - Qt::UserRole) == m_selectedPID) + Qt::UserRole) + == m_selectedPID) this->setCurrentIndex(m_proxyModel->index(i, 0)); } } @@ -829,18 +874,22 @@ void ProcessTableView::initConnections(bool settingsLoaded) //show error dialog if change priority failed connect(ProcessDB::instance(), &ProcessDB::priorityPromoteResultReady, this, - [ = ](const ErrorContext & ec) { - if (ec) { - ErrorDialog::show(this, ec.getErrorName(), ec.getErrorMessage()); - } - }); + [=](const ErrorContext &ec) { + if (ec) { + ErrorDialog::show(this, ec.getErrorName(), ec.getErrorMessage()); + } + }); + qCInfo(app) << "'processControlResultReady' signal is connect?" << m_pControlConnection; + //The singleton object only needs to connect to the signal slot once. //show error dialog if sending signals to process failed - connect(ProcessDB::instance(), &ProcessDB::processControlResultReady, this, - [ = ](const ErrorContext & ec) { - if (ec) { - ErrorDialog::show(this, ec.getErrorName(), ec.getErrorMessage()); - } - }); + if (!m_pControlConnection) + m_pControlConnection = connect(ProcessDB::instance(), &ProcessDB::processControlResultReady, this, + [=](const ErrorContext &ec) { + if (ec) { + ErrorDialog::show(this, ec.getErrorName(), ec.getErrorMessage()); + qCWarning(app) << "ErrorName: " << ec.getErrorName() << ",ErrorMessage: " << ec.getErrorMessage(); + } + }); } // show process table view context menu on specified positon @@ -921,7 +970,7 @@ void ProcessTableView::customizeProcessPriority() prioDialog->setIcon(QIcon::fromTheme("dialog-warning")); prioDialog->setAttribute(Qt::WA_DeleteOnClose); prioDialog->setTitle( - DApplication::translate("Process.Table.Custom.Priority.Dialog", "Custom Priority")); + DApplication::translate("Process.Table.Custom.Priority.Dialog", "Custom Priority")); prioDialog->addSpacing(20); PrioritySlider *slider = new PrioritySlider(Qt::Horizontal, prioDialog); slider->slider()->setInvertedAppearance(true); @@ -931,13 +980,13 @@ void ProcessTableView::customizeProcessPriority() slider->setPageStep(1); slider->slider()->setTracking(true); slider->setMouseWheelEnabled(true); - slider->setBelowTicks({QString("%1").arg(kVeryLowPriorityMin), - QString("%1").arg(kVeryHighPriorityMax)}); + slider->setBelowTicks({ QString("%1").arg(kVeryLowPriorityMin), + QString("%1").arg(kVeryHighPriorityMax) }); // change tip value dynamically when slider value changed connect(slider, &DSlider::valueChanged, - [ = ](int value) { slider->setTipValue(QString("%1").arg(value)); }); + [=](int value) { slider->setTipValue(QString("%1").arg(value)); }); // set initial slider & tip value based on current process priority - QString prio {"0"}; + QString prio { "0" }; if (m_selectedPID.isValid()) { pid_t pid = qvariant_cast(m_selectedPID); slider->setValue(m_model->getProcessPriorityValue(pid)); @@ -958,7 +1007,7 @@ void ProcessTableView::customizeProcessPriority() true, DDialog::ButtonRecommend); // clear focus first, otherwise we wont get the tab order we want prioDialog->clearFocus(); - connect(prioDialog, &DDialog::buttonClicked, this, [ = ](int index, QString text) { + connect(prioDialog, &DDialog::buttonClicked, this, [=](int index, QString text) { Q_UNUSED(text); if (index == 1) { changeProcessPriority(slider->value()); @@ -976,5 +1025,4 @@ void ProcessTableView::setUserModeName(const QString &userName) m_useModeName = userName; m_model->setUserModeName(m_useModeName); } - } diff --git a/deepin-system-monitor-main/gui/system_service_table_view.cpp b/deepin-system-monitor-main/gui/system_service_table_view.cpp index 238920b0..2bdee83c 100644 --- a/deepin-system-monitor-main/gui/system_service_table_view.cpp +++ b/deepin-system-monitor-main/gui/system_service_table_view.cpp @@ -411,10 +411,6 @@ void SystemServiceTableView::initUI(bool settingsLoaded) palette.setColor(DPalette::Text, labelColor); m_noMatchingResultLabel->setPalette(palette); m_noMatchingResultLabel->setVisible(false); - - palette.setColor(DPalette::Button, palette.color(DPalette::Base)); - header()->setPalette(palette); - // header view instance auto *hdr = header(); // header section movable @@ -443,7 +439,8 @@ void SystemServiceTableView::initUI(bool settingsLoaded) setContextMenuPolicy(Qt::CustomContextMenu); // set service table default style when backup settings can not be loaded - if (!settingsLoaded) { + if (!settingsLoaded) + { setColumnWidth(SystemServiceTableModel::kSystemServiceNameColumn, 200); setColumnHidden(SystemServiceTableModel::kSystemServiceNameColumn, false); setColumnWidth(SystemServiceTableModel::kSystemServiceLoadStateColumn, 100); @@ -495,7 +492,7 @@ void SystemServiceTableView::initUI(bool settingsLoaded) m_headerContextMenu = new DMenu(this); // load state column action m_loadStateHeaderAction = m_headerContextMenu->addAction( - DApplication::translate("Service.Table.Header", kSystemServiceLoadState)); + DApplication::translate("Service.Table.Header", kSystemServiceLoadState)); m_loadStateHeaderAction->setCheckable(true); // active state column action m_activeStateHeaderAction = m_headerContextMenu->addAction( @@ -503,11 +500,11 @@ void SystemServiceTableView::initUI(bool settingsLoaded) m_activeStateHeaderAction->setCheckable(true); // sub state column action m_subStateHeaderAction = m_headerContextMenu->addAction( - DApplication::translate("Service.Table.Header", kSystemServiceSubState)); + DApplication::translate("Service.Table.Header", kSystemServiceSubState)); m_subStateHeaderAction->setCheckable(true); // state column action m_stateHeaderAction = m_headerContextMenu->addAction( - DApplication::translate("Service.Table.Header", kSystemServiceState)); + DApplication::translate("Service.Table.Header", kSystemServiceState)); m_stateHeaderAction->setCheckable(true); // description column action m_descriptionHeaderAction = m_headerContextMenu->addAction( @@ -515,7 +512,7 @@ void SystemServiceTableView::initUI(bool settingsLoaded) m_descriptionHeaderAction->setCheckable(true); // pid column m_pidHeaderAction = m_headerContextMenu->addAction( - DApplication::translate("Service.Table.Header", kSystemServicePID)); + DApplication::translate("Service.Table.Header", kSystemServicePID)); m_pidHeaderAction->setCheckable(true); // startup mode column m_startupModeHeaderAction = m_headerContextMenu->addAction( @@ -565,10 +562,6 @@ void SystemServiceTableView::initConnections() palette.setColor(DPalette::Text, labelColor); m_noMatchingResultLabel->setPalette(palette); } - - palette.setColor(DPalette::Button, palette.color(DPalette::Base)); - header()->setPalette(palette); - auto pa = DApplicationHelper::instance()->applicationPalette(); // set spinner color QBrush hlBrush = pa.color(DPalette::Active, DPalette::Highlight); diff --git a/deepin-system-monitor-main/gui/user_page_widget.cpp b/deepin-system-monitor-main/gui/user_page_widget.cpp index e80477a0..1de8a60d 100644 --- a/deepin-system-monitor-main/gui/user_page_widget.cpp +++ b/deepin-system-monitor-main/gui/user_page_widget.cpp @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - +#include "ddlog.h" #include "user_page_widget.h" #include "process_table_view.h" #include "model/process_table_model.h" @@ -28,17 +28,17 @@ DWIDGET_USE_NAMESPACE using namespace common::format; - +using namespace DDLog; UserPageWidget::UserPageWidget(DWidget *parent) : DFrame(parent) { struct passwd *pws; pws = getpwuid(getuid()); m_currentUser = QString(pws->pw_name); - qInfo() << "UserPageWidget Construction:" << "currentuser:" << m_currentUser; + qCInfo(app) << "UserPageWidget Construction:" + << "currentuser:" << m_currentUser; initUI(); initConnections(); - } // destructor @@ -98,7 +98,6 @@ void UserPageWidget::initUI() m_DiskReadLabel->setToolTip(QApplication::translate("Process.Table.Header", kProcessDiskRead)); m_DiskWriteLabel->setToolTip(QApplication::translate("Process.Table.Header", kProcessDiskWrite)); - m_CPUUsageSummary = new DLabel(usageSummaryWidget); m_MemeryUsageSummary = new DLabel(usageSummaryWidget); m_SMemUsageSummary = new DLabel(usageSummaryWidget); @@ -152,7 +151,6 @@ void UserPageWidget::initUI() usageSummaryWidget->setLayout(usageLayout); /***********************************************usage Labels**************************************************/ - QWidget *userInfoWideget = new QWidget(this); auto *contentlayout = new QVBoxLayout(userInfoWideget); @@ -175,7 +173,7 @@ void UserPageWidget::initConnections() { connect(m_accountListWidget, &AccountsWidget::signalCurrentChanged, this, &UserPageWidget::onUserChanged); connect(m_procTable, &ProcessTableView::signalModelUpdated, this, &UserPageWidget::onTextContentChanged); - connect(m_dAppHelper, &DApplicationHelper::themeTypeChanged, this, &UserPageWidget::onThemeChanged); + connect(m_dAppHelper, &DApplicationHelper::themeTypeChanged, this, &UserPageWidget::onThemeChanged); connect(m_procTable, &ProcessTableView::signalHeadchanged, this, &UserPageWidget::onHeaderChanged); } @@ -191,20 +189,16 @@ void UserPageWidget::paintEvent(QPaintEvent *) DApplicationHelper *dAppHelper = DApplicationHelper::instance(); DPalette palette = dAppHelper->applicationPalette(); QColor bgColor = palette.color(DPalette::Background); - - - } void UserPageWidget::onUserChanged() { QString userName = m_accountListWidget->getCurrentItemUserName(); - qInfo() << userName << "user changed"; + qCInfo(app) << userName << "user changed"; m_procTable->setUserModeName(userName); onTextContentChanged(); update(); } - void UserPageWidget::onTextContentChanged() { @@ -331,7 +325,6 @@ void UserPageWidget::onThemeChanged() m_DiskWriteLabel->setPalette(palette); } - if (m_CPUUsageSummary) { auto palette = DApplicationHelper::instance()->applicationPalette(); palette.setColor(DPalette::Text, palette.color(DPalette::TextTips)); @@ -372,6 +365,4 @@ void UserPageWidget::onThemeChanged() palette.setColor(DPalette::Text, palette.color(DPalette::TextTips)); m_DiskWriteSummary->setPalette(palette); } - - } diff --git a/deepin-system-monitor-main/gui/xwin_kill_preview_widget.cpp b/deepin-system-monitor-main/gui/xwin_kill_preview_widget.cpp index 03250b0c..3c536d26 100644 --- a/deepin-system-monitor-main/gui/xwin_kill_preview_widget.cpp +++ b/deepin-system-monitor-main/gui/xwin_kill_preview_widget.cpp @@ -11,6 +11,10 @@ #include "main_window.h" #include "ui_common.h" #include "common/common.h" +#include "ddlog.h" +#ifdef USE_DEEPIN_WAYLAND +# include "3rdparty/displayjack/wayland_client.h" +#endif #include #include @@ -31,9 +35,20 @@ using namespace std; using namespace core::wm; using namespace common::init; +using namespace DDLog; + +typedef int (*InitDtkWmDisplayPtr)(); +typedef void (*DestoryDtkWmDisplayPtr)(); +typedef int (*GetAllWindowStatesListPtr)(WindowState **states); + +// displayjack库接口 +static InitDtkWmDisplayPtr InitDtkWmDisplay = nullptr; +static DestoryDtkWmDisplayPtr DestoryDtkWmDisplay = nullptr; +static GetAllWindowStatesListPtr GetAllWindowStatesList = nullptr; // constructor -XWinKillPreviewWidget::XWinKillPreviewWidget(QWidget *parent) : QWidget(parent) +XWinKillPreviewWidget::XWinKillPreviewWidget(QWidget *parent) + : QWidget(parent) { // new window manager instance m_wminfo = new WMInfo(); @@ -43,8 +58,16 @@ XWinKillPreviewWidget::XWinKillPreviewWidget(QWidget *parent) : QWidget(parent) if (WaylandCentered) { m_connectionThread = new QThread(this); m_connectionThreadObject = new ConnectionThread(); + + QLibrary library("libdtkwmjack.so"); + InitDtkWmDisplay = reinterpret_cast(library.resolve("InitDtkWmDisplay")); + DestoryDtkWmDisplay = reinterpret_cast(library.resolve("DestoryDtkWmDisplay")); + GetAllWindowStatesList = reinterpret_cast(library.resolve("GetAllWindowStatesList")); + + if (InitDtkWmDisplay) + InitDtkWmDisplay(); } -#endif // USE_DEEPIN_WAYLAND +#endif // USE_DEEPIN_WAYLAND // init ui components & connections initUI(); @@ -68,13 +91,17 @@ XWinKillPreviewWidget::~XWinKillPreviewWidget() releaseMouse(); releaseKeyboard(); delete m_wminfo; + #ifdef USE_DEEPIN_WAYLAND if (WaylandCentered) { m_connectionThread->quit(); m_connectionThread->wait(); m_connectionThreadObject->deleteLater(); + + if (DestoryDtkWmDisplay) + DestoryDtkWmDisplay(); } -#endif // USE_DEEPIN_WAYLAND +#endif // USE_DEEPIN_WAYLAND } // mouse press event @@ -88,7 +115,7 @@ void XWinKillPreviewWidget::mousePressEvent(QMouseEvent *event) auto pos = QCursor::pos(); #ifdef USE_DEEPIN_WAYLAND if (WaylandCentered) { - double ratio = QGuiApplication::primaryScreen()->devicePixelRatio(); // 获得当前的缩放比例 + double ratio = QGuiApplication::primaryScreen()->devicePixelRatio(); // 获得当前的缩放比例 QRect screenRect; for (auto screen : QApplication::screens()) { // screen geometry @@ -99,11 +126,11 @@ void XWinKillPreviewWidget::mousePressEvent(QMouseEvent *event) } } for (QVector::iterator it = m_windowStates.end() - 1; - it != m_windowStates.begin(); --it) { + it != m_windowStates.begin(); --it) { // if the window is created by ourself, then ignore it if (getpid() == it->pid || QString::fromStdString(it->resourceName) == "dde-desktop" || it->isMinimized - || QString::fromStdString(it->resourceName) == "deepin-deepinid-client" - || QString::fromStdString(it->resourceName) == "dde-dock") + || QString::fromStdString(it->resourceName) == "deepin-deepinid-client" + || QString::fromStdString(it->resourceName) == "dde-dock") continue; // if such window exists, we emit window clicked signal to notify kill application performed action @@ -125,10 +152,10 @@ void XWinKillPreviewWidget::mousePressEvent(QMouseEvent *event) } } } -#endif // USE_DEEPIN_WAYLAND +#endif // USE_DEEPIN_WAYLAND if (!WaylandCentered) { - double ratio = QGuiApplication::primaryScreen()->devicePixelRatio(); // 获得当前的缩放比例 + double ratio = QGuiApplication::primaryScreen()->devicePixelRatio(); // 获得当前的缩放比例 QRect screenRect; for (auto screen : QApplication::screens()) { // screen geometry @@ -138,8 +165,8 @@ void XWinKillPreviewWidget::mousePressEvent(QMouseEvent *event) break; } } - QPoint windowPos(static_cast(screenRect.x() + (pos.x() - screenRect.x())*ratio), - static_cast(screenRect.y() + (pos.y() - screenRect.y())*ratio)); + QPoint windowPos(static_cast(screenRect.x() + (pos.x() - screenRect.x()) * ratio), + static_cast(screenRect.y() + (pos.y() - screenRect.y()) * ratio)); auto list = m_wminfo->selectWindow(windowPos); // fix cursor not update issue while moved to areas covered by intersected area of dock & normal windows @@ -175,7 +202,7 @@ void XWinKillPreviewWidget::mouseMoveEvent(QMouseEvent *) { #ifdef USE_DEEPIN_WAYLAND if (WaylandCentered) { - double ratio = QGuiApplication::primaryScreen()->devicePixelRatio(); // 获得当前的缩放比例 + double ratio = QGuiApplication::primaryScreen()->devicePixelRatio(); // 获得当前的缩放比例 auto pos = QCursor::pos(); QRect screenRect; for (auto screen : QApplication::screens()) { @@ -187,15 +214,15 @@ void XWinKillPreviewWidget::mouseMoveEvent(QMouseEvent *) } } // get the list of windows under cursor from cache in stacked order - bool found {false}; + bool found { false }; for (QVector::iterator it = m_windowStates.end() - 1; - it != m_windowStates.begin(); --it) { + it != m_windowStates.begin(); --it) { // if the window is created by ourself, then ignore it // wayland环境下增加桌面窗口和dock栏的屏蔽 if (getpid() == it->pid || QString::fromStdString(it->resourceName) == "dde-desktop" || it->isMinimized - || QString::fromStdString(it->resourceName) == "deepin-deepinid-client" - || QString::fromStdString(it->resourceName) == "dde-dock") + || QString::fromStdString(it->resourceName) == "deepin-deepinid-client" + || QString::fromStdString(it->resourceName) == "dde-dock") continue; auto selRect = QRect(static_cast(screenRect.x() + (it->geometry.x - screenRect.x()) / ratio), static_cast(screenRect.y() + (it->geometry.y - screenRect.y()) / ratio), @@ -205,12 +232,12 @@ void XWinKillPreviewWidget::mouseMoveEvent(QMouseEvent *) // find all windows hovered above, if any clip out the intersected region - QRegion region {selRect}; + QRegion region { selRect }; //对于所选窗口上方存在堆叠的窗口情况,对所选窗口进行区域裁剪。 for (QVector::iterator iter = m_windowStates.end() - 1; - iter != it; --iter) { + iter != it; --iter) { if (QString::fromStdString(iter->resourceName) == "dde-desktop" || iter->isMinimized || QString::fromStdString(iter->resourceName) == "deepin-deepinid-client" - || QString::fromStdString(iter->resourceName) == "dde-dock" || getpid() == iter->pid) + || QString::fromStdString(iter->resourceName) == "dde-dock" || getpid() == iter->pid) continue; else { @@ -221,10 +248,8 @@ void XWinKillPreviewWidget::mouseMoveEvent(QMouseEvent *) region = region.subtracted(upRegion); } - } - // if current selected window is crossing screens, we need update each sub part on each screen for (auto &bg : m_backgroundList) { if (bg->geometry().intersects(selRect)) { @@ -246,9 +271,9 @@ void XWinKillPreviewWidget::mouseMoveEvent(QMouseEvent *) emit cursorUpdated(m_defaultCursor); } } -#endif // USE_DEEPIN_WAYLAND +#endif // USE_DEEPIN_WAYLAND if (!WaylandCentered) { - double ratio = QGuiApplication::primaryScreen()->devicePixelRatio(); // 获得当前的缩放比例 + double ratio = QGuiApplication::primaryScreen()->devicePixelRatio(); // 获得当前的缩放比例 auto pos = QCursor::pos(); QRect screenRect; for (auto screen : QApplication::screens()) { @@ -259,11 +284,11 @@ void XWinKillPreviewWidget::mouseMoveEvent(QMouseEvent *) break; } } - QPoint windowPos(static_cast(screenRect.x() + (pos.x() - screenRect.x())*ratio), - static_cast(screenRect.y() + (pos.y() - screenRect.y())*ratio)); + QPoint windowPos(static_cast(screenRect.x() + (pos.x() - screenRect.x()) * ratio), + static_cast(screenRect.y() + (pos.y() - screenRect.y()) * ratio)); // get the list of windows under cursor from cache in stacked order auto list = m_wminfo->selectWindow(windowPos); - bool found {false}; + bool found { false }; // fix cursor not update issue while moved to areas covered by intersected area of dock & normal windows if (m_wminfo->isCursorHoveringDocks(windowPos)) { @@ -284,7 +309,7 @@ void XWinKillPreviewWidget::mouseMoveEvent(QMouseEvent *) // find all windows hovered above, if any clip out the intersected region auto hoveredBy = m_wminfo->getHoveredByWindowList(select->wid, select->rect); - QRegion region {selRect}; + QRegion region { selRect }; for (auto &hover : hoveredBy) { QRect hoverrect(static_cast(screenRect.x() + (hover->rect.x() - screenRect.x()) / ratio), static_cast(screenRect.y() + (hover->rect.y() - screenRect.y()) / ratio), @@ -353,10 +378,9 @@ void XWinKillPreviewWidget::initUI() // default forbid style cursor m_defaultCursor = QCursor(Qt::ForbiddenCursor); - QTimer::singleShot(500, this, [ = ] { + QTimer::singleShot(500, this, [=] { // show background window in all screens - for (auto screen : QApplication::screens()) - { + for (auto screen : QApplication::screens()) { // screen geometry auto geom = screen->geometry(); // snapshot current scree @@ -364,7 +388,7 @@ void XWinKillPreviewWidget::initUI() #ifdef USE_DEEPIN_WAYLAND if (WaylandCentered) pixmap = screen->grabWindow(m_windowStates.end()->windowId); -#endif // USE_DEEPIN_WAYLAND +#endif // USE_DEEPIN_WAYLAND pixmap = pixmap.copy(geom.x(), geom.y(), static_cast(geom.width() * devicePixelRatioF()), static_cast(geom.height() * devicePixelRatioF())); // create preview background widget for each screen auto *background = new XWinKillPreviewBackgroundWidget(pixmap, this); @@ -392,42 +416,42 @@ void XWinKillPreviewWidget::initConnections() #ifdef USE_DEEPIN_WAYLAND if (WaylandCentered) { connect(m_connectionThreadObject, &ConnectionThread::connected, this, - [this] { - m_eventQueue = new EventQueue(this); - m_eventQueue->setup(m_connectionThreadObject); - - Registry *registry = new Registry(this); - setupRegistry(registry); - }, - Qt::QueuedConnection - ); + [this] { + m_eventQueue = new EventQueue(this); + m_eventQueue->setup(m_connectionThreadObject); + + Registry *registry = new Registry(this); + setupRegistry(registry); + }, + Qt::QueuedConnection); m_connectionThreadObject->moveToThread(m_connectionThread); m_connectionThread->start(); m_connectionThreadObject->initConnection(); } -#endif // USE_DEEPIN_WAYLAND +#endif // USE_DEEPIN_WAYLAND } + //打印当前窗口信息接口 #ifdef USE_DEEPIN_WAYLAND void XWinKillPreviewWidget::print_window_states(const QVector &m_windowStates) { if (WaylandCentered) { for (int i = 0; i < m_windowStates.count(); ++i) { - qDebug() << QDateTime::currentDateTime().toString(QLatin1String("hh:mm:ss.zzz ")) \ - << "window[" << i << "]" << "pid:" << m_windowStates.at(i).pid \ - << "title:" << m_windowStates.at(i).resourceName \ - << "windowId:" << m_windowStates.at(i).windowId \ - << "geometry:" << m_windowStates.at(i).geometry.x << m_windowStates.at(i).geometry.y \ - << m_windowStates.at(i).geometry.width << m_windowStates.at(i).geometry.height \ - << "isMinimized(" << m_windowStates.at(i).isMinimized << ")" \ - << "isFullScreen(" << m_windowStates.at(i).isFullScreen << ")" \ - << "isActive(" << m_windowStates.at(i).isActive << ")"; + qCDebug(app) << QDateTime::currentDateTime().toString(QLatin1String("hh:mm:ss.zzz ")) + << "window[" << i << "]" + << "pid:" << m_windowStates.at(i).pid + << "title:" << m_windowStates.at(i).resourceName + << "windowId:" << m_windowStates.at(i).windowId + << "geometry:" << m_windowStates.at(i).geometry.x << m_windowStates.at(i).geometry.y + << m_windowStates.at(i).geometry.width << m_windowStates.at(i).geometry.height + << "isMinimized(" << m_windowStates.at(i).isMinimized << ")" + << "isFullScreen(" << m_windowStates.at(i).isFullScreen << ")" + << "isActive(" << m_windowStates.at(i).isActive << ")"; } } } -#endif // USE_DEEPIN_WAYLAND - +#endif // USE_DEEPIN_WAYLAND //wayland 注册 #ifdef USE_DEEPIN_WAYLAND @@ -435,34 +459,68 @@ void XWinKillPreviewWidget::setupRegistry(Registry *registry) { if (WaylandCentered) { connect(registry, &Registry::compositorAnnounced, this, - [this, registry](quint32 name, quint32 version) { - m_compositor = registry->createCompositor(name, version, this); - } - ); + [this, registry](quint32 name, quint32 version) { + m_compositor = registry->createCompositor(name, version, this); + }); connect(registry, &Registry::clientManagementAnnounced, this, - [this, registry](quint32 name, quint32 version) { - m_clientManagement = registry->createClientManagement(name, version, this); - connect(m_clientManagement, &ClientManagement::windowStatesChanged, this, - [this] { - m_windowStates = m_clientManagement->getWindowStates(); - } - ); - } - ); + [this, registry](quint32 name, quint32 version) { + m_clientManagement = registry->createClientManagement(name, version, this); + connect(m_clientManagement, &ClientManagement::windowStatesChanged, this, + [this] { + m_windowStates = getAllWindowStates(); + }); + }); connect(registry, &Registry::interfacesAnnounced, this, - [this] { - Q_ASSERT(m_compositor); - Q_ASSERT(m_clientManagement); - m_windowStates = m_clientManagement->getWindowStates(); - } - ); + [this] { + Q_ASSERT(m_compositor); + Q_ASSERT(m_clientManagement); + m_windowStates = getAllWindowStates(); + }); registry->setEventQueue(m_eventQueue); registry->create(m_connectionThreadObject); registry->setup(); } } -#endif // USE_DEEPIN_WAYLAND +QVector XWinKillPreviewWidget::getAllWindowStates() +{ + QVector vWindowStates; + + // 能解析到displayjack的接口,优先使用dispalayjack接口获取窗口状态 + if (GetAllWindowStatesList) { + // 使用displayjack库接口获取窗口状态 + WindowState *pStates = nullptr; + int nCount = GetAllWindowStatesList(&pStates); + if (nCount <= 0) + return vWindowStates; + + for (int i = 0; i < nCount; i++) { + WindowState *p = &pStates[i]; + ClientManagement::WindowState windowState; + windowState.pid = p->pid; + windowState.windowId = p->windowId; + memcpy(windowState.resourceName, p->resourceName, sizeof(p->resourceName)); + windowState.geometry.x = p->geometry.x; + windowState.geometry.y = p->geometry.y; + windowState.geometry.width = p->geometry.width; + windowState.geometry.height = p->geometry.height; + windowState.isMinimized = p->isMinimized; + windowState.isFullScreen = p->isFullScreen; + windowState.isActive = p->isActive; + + vWindowStates.push_back(windowState); + } + free(pStates); + } else { + // 使用kde接口获取窗口状态 + Q_ASSERT(m_clientManagement); + return m_clientManagement->getWindowStates(); + } + + return vWindowStates; +} + +#endif // USE_DEEPIN_WAYLAND diff --git a/deepin-system-monitor-main/gui/xwin_kill_preview_widget.h b/deepin-system-monitor-main/gui/xwin_kill_preview_widget.h index c6e88434..c7bc4072 100644 --- a/deepin-system-monitor-main/gui/xwin_kill_preview_widget.h +++ b/deepin-system-monitor-main/gui/xwin_kill_preview_widget.h @@ -19,10 +19,17 @@ // 使用 USE_DEEPIN_WAYLAND 宏决定编译时是否支持 wayland // 如果支持,用全局变量 WaylandCentered 运行时控制 #ifdef USE_DEEPIN_WAYLAND +#ifdef DWAYLAND +#include +#include +#include +#include +#else #include #include #include #include +#endif using namespace KWayland::Client; #endif // USE_DEEPIN_WAYLAND @@ -56,7 +63,7 @@ class XWinKillPreviewWidget : public QWidget * @brief Print current window states * @param QVector of window state which contains pid,windowid,resourceName,geometry,etc */ - void print_window_states(const QVector &m_windowStates); + void print_window_states(const QVector &m_windowStates); #endif // USE_DEEPIN_WAYLAND signals: @@ -100,6 +107,10 @@ public slots: */ void initConnections(); +#ifdef USE_DEEPIN_WAYLAND + QVector getAllWindowStates(); +#endif + private: // Window manager (x11) instance core::wm::WMInfo *m_wminfo; @@ -123,7 +134,7 @@ public slots: QThread *m_connectionThread; //Thread connet to wayland ConnectionThread *m_connectionThreadObject; - //Event Queue + //Event Queue EventQueue *m_eventQueue = nullptr; //wayland compositor Compositor *m_compositor = nullptr; diff --git a/deepin-system-monitor-main/logger.cpp b/deepin-system-monitor-main/logger.cpp new file mode 100644 index 00000000..9be9fcc8 --- /dev/null +++ b/deepin-system-monitor-main/logger.cpp @@ -0,0 +1,67 @@ +// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#include "logger.h" +#include "dtkcore_global.h" +#include "qglobal.h" +#include "ddlog.h" +#include +#include + +#include +using namespace DDLog; +DCORE_USE_NAMESPACE + +MLogger::MLogger(QObject *parent) + : QObject(parent), m_rules(""), m_config(nullptr) +{ + QByteArray logRules = qgetenv("QT_LOGGING_RULES"); + // qunsetenv 之前一定不要有任何日志打印,否则取消环境变量设置不会生效 + qunsetenv("QT_LOGGING_RULES"); + + // set env + m_rules = logRules; + + // set dconfig + m_config = DConfig::create("org.deepin.system-monitor", "org.deepin.system-monitor"); + logRules = m_config->value("log_rules").toByteArray(); + appendRules(logRules); + setRules(m_rules); + + // watch dconfig + connect(m_config, &DConfig::valueChanged, this, [this](const QString &key) { + qCCritical(app) << "value changed:" << key; + if (key == "log_rules") { + setRules(m_config->value(key).toByteArray()); + } + }); +} + +MLogger::~MLogger() +{ + m_config->deleteLater(); +} + +void MLogger::setRules(const QString &rules) +{ + auto tmpRules = rules; + m_rules = tmpRules.replace(";", "\n"); + QLoggingCategory::setFilterRules(m_rules); +} + +void MLogger::appendRules(const QString &rules) +{ + QString tmpRules = rules; + tmpRules = tmpRules.replace(";", "\n"); + auto tmplist = tmpRules.split('\n'); + for (int i = 0; i < tmplist.count(); i++) + if (m_rules.contains(tmplist.at(i))) { + tmplist.removeAt(i); + i--; + } + if (tmplist.isEmpty()) + return; + m_rules.isEmpty() ? m_rules = tmplist.join("\n") + : m_rules += "\n" + tmplist.join("\n"); +} diff --git a/deepin-system-monitor-main/logger.h b/deepin-system-monitor-main/logger.h new file mode 100644 index 00000000..946fa7a3 --- /dev/null +++ b/deepin-system-monitor-main/logger.h @@ -0,0 +1,28 @@ +// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#include +#include + +DCORE_BEGIN_NAMESPACE +class DConfig; +DCORE_END_NAMESPACE + +class MLogger : public QObject +{ + Q_OBJECT +public: + explicit MLogger(QObject *parent = nullptr); + ~MLogger(); + + inline QString rules() const { return m_rules; } + void setRules(const QString &rules); + +private: + void appendRules(const QString &rules); + +private: + QString m_rules; + Dtk::Core::DConfig *m_config; +}; diff --git a/deepin-system-monitor-main/main.cpp b/deepin-system-monitor-main/main.cpp index d7ea76fe..69e83b5c 100644 --- a/deepin-system-monitor-main/main.cpp +++ b/deepin-system-monitor-main/main.cpp @@ -24,7 +24,7 @@ #include #include #include - +#include "logger.h" DWIDGET_USE_NAMESPACE DCORE_USE_NAMESPACE @@ -32,6 +32,18 @@ using namespace common::init; int main(int argc, char *argv[]) { + MLogger(); // 日志处理要放在app之前,否则QApplication + // 内部可能进行了日志打印,导致环境变量设置不生效 +// 为了兼容性 +#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 8, 0)) + Dtk::Core::DLogManager::registerJournalAppender(); +#else + Dtk::Core::DLogManager::registerFileAppender(); +#endif +#ifdef QT_DEBUG + Dtk::Core::DLogManager::registerConsoleAppender(); +#endif + //Judge if Wayland WaylandSearchCentered(); if (!QString(qgetenv("XDG_CURRENT_DESKTOP")).toLower().startsWith("deepin")) { @@ -54,7 +66,7 @@ int main(int argc, char *argv[]) return 0; //获取dmidecode中CPU频率信息 - char *const cmd[] = {"dmidecode", "-t", "4"}; + char *const cmd[] = { "dmidecode", "-t", "4" }; get_cpuinfo_from_dmi(3, cmd); PERF_PRINT_BEGIN("POINT-01", ""); @@ -66,12 +78,12 @@ int main(int argc, char *argv[]) app.loadTranslator(); const QString descriptionText = DApplication::translate( - "App.About", - "System Monitor is a tool to monitor realtime system load, " - "view and control processes and services running on your system."); + "App.About", + "System Monitor is a tool to monitor realtime system load, " + "view and control processes and services running on your system."); const QString acknowledgementLink = - "https://www.deepin.org/acknowledgments/deepin-system-monitor#thanks"; + "https://www.deepin.org/acknowledgments/deepin-system-monitor#thanks"; app.setOrganizationName("deepin"); app.setApplicationName("deepin-system-monitor"); diff --git a/deepin-system-monitor-main/model/accounts_info_model.cpp b/deepin-system-monitor-main/model/accounts_info_model.cpp index c36caab1..5699f8d4 100644 --- a/deepin-system-monitor-main/model/accounts_info_model.cpp +++ b/deepin-system-monitor-main/model/accounts_info_model.cpp @@ -1,56 +1,70 @@ #include "accounts_info_model.h" +#include "helper.hpp" +#include "ddlog.h" #include #include +#include +#include +#include #include #include +using namespace DDLog; + #define PKEXEC_PATH "/usr/bin/pkexec" #define PKILL_PATH "/usr/bin/pkill" -const QString AccountsService("com.deepin.daemon.Accounts"); -const QString LoginService("org.freedesktop.login1"); -const QString ControlCenterService("com.deepin.dde.ControlCenter"); +const QString LoginService = "org.freedesktop.login1"; +const QString LoginPath = "/org/freedesktop/login1"; +const QString LoginInterface = "org.freedesktop.login1.Manager"; -AccountsInfoModel::AccountsInfoModel(QObject *parent): QObject(parent) - , m_accountsInter(new Accounts(AccountsService, "/com/deepin/daemon/Accounts", QDBusConnection::systemBus(), this)) - , m_LoginInter(new LoginManager(LoginService, "/org/freedesktop/login1", QDBusConnection::systemBus(), this)) - , m_controlInter(new ControlCenter(ControlCenterService, "/com/deepin/dde/ControlCenter", QDBusConnection::sessionBus(), this)) - , m_currentUserType(-1) +AccountsInfoModel::AccountsInfoModel(QObject *parent) + : QObject(parent), m_accountsInter(new QDBusInterface(common::systemInfo().AccountsService, common::systemInfo().AccountsPath, common::systemInfo().AccountsInterface, QDBusConnection::systemBus(), this)), m_LoginInter(new QDBusInterface(LoginService, LoginPath, LoginInterface, QDBusConnection::systemBus(), this)), m_controlInter(new QDBusInterface(common::systemInfo().ControlCenterService, common::systemInfo().ControlCenterPath, common::systemInfo().ControlCenterInterface, QDBusConnection::sessionBus(), this)), m_currentUserType(-1) { qDBusRegisterMetaType(); qDBusRegisterMetaType(); struct passwd *pws; pws = getpwuid(getuid()); m_currentUserName = QString(pws->pw_name); - qInfo() << "AccountsInfoModel constructor line 26" << "m_currentUserName:" << m_currentUserName; + qCInfo(app) << "AccountsInfoModel constructor line 26" + << "m_currentUserName:" << m_currentUserName; //获取online userList updateUserOnlineStatus(); - qInfo() << "AccountsInfoModel constructor line 29" << "online user list:" << m_onlineUsers; - updateUserList(m_accountsInter->userList()); - qInfo() << "AccountsInfoModel constructor line 31" << "Accounts user list:" << m_accountsInter->userList(); - - connect(m_accountsInter, &Accounts::UserListChanged, this, &AccountsInfoModel::onUserListChanged, Qt::QueuedConnection); - connect(m_LoginInter, &LoginManager::SessionNew, this, &AccountsInfoModel::onSessionNew, Qt::QueuedConnection); - connect(m_LoginInter, &LoginManager::SessionRemoved, this, &AccountsInfoModel::onSessionNew, Qt::QueuedConnection); + qCInfo(app) << "AccountsInfoModel constructor line 29" + << "online user list:" << m_onlineUsers; + + QStringList userList = m_accountsInter->property("UserList").toStringList(); + updateUserList(userList); + qCInfo(app) << "AccountsInfoModel constructor line 31" + << "Accounts user list:" << userList; + + QDBusConnection::systemBus().connect(common::systemInfo().AccountsService, common::systemInfo().AccountsPath, common::systemInfo().AccountsInterface, "UserListChanged", + this, SLOT(onUserListChanged(QStringList))); + QDBusConnection::systemBus().connect(LoginService, LoginPath, LoginInterface, "SessionNew", + this, SLOT(onSessionNew(QString, QDBusObjectPath))); + QDBusConnection::systemBus().connect(LoginService, LoginPath, LoginInterface, "SessionRemoved", + this, SLOT(onSessionNew(QString, QDBusObjectPath))); +} +AccountsInfoModel::~AccountsInfoModel() +{ + qDeleteAll(m_userMap.values()); + m_userMap.clear(); } void AccountsInfoModel::onUserListChanged(const QStringList &userPathList) { updateUserList(userPathList); - qInfo() << "get update:" << userPathList; + qCInfo(app) << "get update:" << userPathList; } - - - - void AccountsInfoModel::onSessionNew(const QString &in0, const QDBusObjectPath &in1) { Q_UNUSED(in0); Q_UNUSED(in1); updateUserOnlineStatus(); } + void AccountsInfoModel::onSessionRemoved(const QString &in0, const QDBusObjectPath &in1) { Q_UNUSED(in0); @@ -58,40 +72,45 @@ void AccountsInfoModel::onSessionRemoved(const QString &in0, const QDBusObjectPa updateUserOnlineStatus(); } - void AccountsInfoModel::updateUserList(const QStringList &userPathList) { - qInfo() << "AccountsInfoModel updateUserList line 61" << "updateUserList begins!" ; + qCInfo(app) << "AccountsInfoModel updateUserList line 61" + << "updateUserList begins!"; + // 释放构造对象 + qDeleteAll(m_userMap.values()); m_userMap.clear(); + for (QString userPath : userPathList) { - AccountsUser *userDBus = new AccountsUser("com.deepin.daemon.Accounts", userPath, QDBusConnection::systemBus(), this); + QDBusInterface *userDBus = new QDBusInterface(common::systemInfo().AccountsService, userPath, common::systemInfo().UserInterface, QDBusConnection::systemBus(), this); User *newUser = new User; - newUser->setName(userDBus->userName()); - newUser->setFullname(userDBus->fullName()); - newUser->setIconFile(userDBus->iconFile()); - newUser->setUserType(userDBus->accountType()); - newUser->setUserUid(userDBus->uid()); + + newUser->setName(userDBus->property("UserName").toString()); + newUser->setFullname(userDBus->property("FullName").toString()); + newUser->setIconFile(userDBus->property("IconFile").toString()); + newUser->setUserType(userDBus->property("AccountType").toInt()); + newUser->setUserUid(userDBus->property("Uid").toString()); + //当前用户 if (newUser->name() == m_currentUserName) { newUser->setIsCurrentUser(true); m_currentUserType = newUser->userType(); } - qInfo() << "AccountsInfoModel updateUserList line 78" << "get user info of :" << newUser->name(); + qCInfo(app) << "AccountsInfoModel updateUserList line 78" + << "get user info of :" << newUser->name(); m_userMap.insert(newUser->name(), newUser); + delete userDBus; } - - } - void AccountsInfoModel::updateUserOnlineStatus() { - qInfo() << "AccountsInfoModel updateUserOnlineStatus line 88" << "updateUserOnlineStatus begins!" ; + qCInfo(app) << "AccountsInfoModel updateUserOnlineStatus line 88" + << "updateUserOnlineStatus begins!"; m_onlineUsers.clear(); //异步获取SessionList - QDBusMessage message = m_LoginInter->call("ListSessions"); + QDBusMessage message = m_LoginInter->call("ListSessions"); QDBusPendingReply reply = m_LoginInter->asyncCall(QStringLiteral("ListSessions")); reply.waitForFinished(); if (reply.isValid()) { @@ -105,7 +124,6 @@ void AccountsInfoModel::updateUserOnlineStatus() Q_EMIT signalUserOnlineStatusUpdated(); } - QList AccountsInfoModel::userList() const { QList onlineUsers; @@ -116,7 +134,8 @@ QList AccountsInfoModel::userList() const onlineUsers << user; } } - qInfo() << "AccountsInfoModel userList" << "get online users:" << m_onlineUsers; + qCInfo(app) << "AccountsInfoModel userList" + << "get online users:" << m_onlineUsers; return onlineUsers; } @@ -137,20 +156,18 @@ bool AccountsInfoModel::lockSessionByUserName(const QString &userName) if (m_sessionList.size() > 0) { for (SessionInfo si : m_sessionList) { if (si.userName == userName) { - m_LoginInter->LockSession(si.sessionId); + m_LoginInter->call("LockSession", si.sessionId); return true; } } - qDebug() << "cannot find session with this username!"; + qCDebug(app) << "cannot find session with this username!"; return false; } else { - qDebug() << "no session found!"; + qCDebug(app) << "no session found!"; return false; } - } - bool AccountsInfoModel::activateSessionByUserName(const QString &userName) { @@ -159,48 +176,44 @@ bool AccountsInfoModel::activateSessionByUserName(const QString &userName) for (SessionInfo si : m_sessionList) { if (si.userName == userName) { - m_LoginInter->ActivateSession(si.sessionId); + m_LoginInter->call("ActivateSession", si.sessionId); return true; } - } - qDebug() << "cannot find session with this username!"; + qCDebug(app) << "cannot find session with this username!"; return false; } else { - qDebug() << "no session found!"; + qCDebug(app) << "no session found!"; return false; } - } bool AccountsInfoModel::LogoutByUserName(const QString &userName) { if (userName == m_currentUserName) { if (m_sessionList.size() > 0) { - qInfo() << "m_sessionList is OK"; + qCInfo(app) << "m_sessionList is OK"; for (SessionInfo si : m_sessionList) { if (si.userName == userName) { - qInfo() << "found" << userName << si.sessionId; - qInfo() << m_LoginInter->TerminateSession(si.sessionId).error(); + qCInfo(app) << "found" << userName << si.sessionId; + // qCInfo(app) << m_LoginInter->TerminateSession(si.sessionId).error(); return true; } - } - qDebug() << "cannot find session with current username!"; + qCDebug(app) << "cannot find session with current username!"; } else { - qDebug() << "no session found!"; - + qCDebug(app) << "no session found!"; } } else { QStringList params; // check pkexec existance - if (!QFile::exists({PKEXEC_PATH})) { + if (!QFile::exists({ PKEXEC_PATH })) { return false; } // check kill existance - if (!QFile::exists({PKILL_PATH})) { + if (!QFile::exists({ PKILL_PATH })) { return false; } @@ -208,20 +221,23 @@ bool AccountsInfoModel::LogoutByUserName(const QString &userName) QProcess proc; - proc.start({PKEXEC_PATH}, params); + proc.start({ PKEXEC_PATH }, params); proc.waitForFinished(); return true; } return false; - } void AccountsInfoModel::EditAccount() { - if (m_controlInter) - m_controlInter->ShowPage("accounts", "Accounts Detail"); - + if (m_controlInter) { + bool version = common::systemInfo().isOldVersion(); + if (version) { + //专业版v20接口:ShowPage(String module, String page) + m_controlInter->call("ShowPage", "accounts", "Accounts Detail"); + } else { + //社区版V23接口:ShowPage(String url) + m_controlInter->call("ShowPage", "accounts"); + } + } } - - - diff --git a/deepin-system-monitor-main/model/accounts_info_model.h b/deepin-system-monitor-main/model/accounts_info_model.h index 19331d11..a6922f13 100644 --- a/deepin-system-monitor-main/model/accounts_info_model.h +++ b/deepin-system-monitor-main/model/accounts_info_model.h @@ -1,17 +1,19 @@ #ifndef ACCOUNTS_INFO_MODEL_H #define ACCOUNTS_INFO_MODEL_H #include "user.h" -#include -#include -#include -#include +//#include +//#include +//#include +//#include #include +#include +#include -using Accounts = com::deepin::daemon::Accounts; -using AccountsUser = com::deepin::daemon::accounts::User; -using LoginManager = org::freedesktop::login1::Manager; -using ControlCenter = com::deepin::dde::ControlCenter; +//using Accounts = com::deepin::daemon::Accounts; +//using AccountsUser = com::deepin::daemon::accounts::User; +//using LoginManager = org::freedesktop::login1::Manager; +//using ControlCenter = com::deepin::dde::ControlCenter; typedef struct _SessionInfo { QString sessionId; @@ -60,6 +62,7 @@ class AccountsInfoModel : public QObject public: explicit AccountsInfoModel(QObject *parent = nullptr); + virtual ~AccountsInfoModel(); void updateUserList(const QStringList &userPathList); QList userList() const; User::UserType getCurrentUserType() const; @@ -80,11 +83,11 @@ public Q_SLOTS: private: - Accounts *m_accountsInter; + QDBusInterface *m_accountsInter; QMap m_userMap ; QStringList m_onlineUsers; - LoginManager *m_LoginInter; - ControlCenter *m_controlInter; + QDBusInterface *m_LoginInter; + QDBusInterface *m_controlInter; QString m_currentUserName; int m_currentUserType; SessionInfoList m_sessionList {}; diff --git a/deepin-system-monitor-main/model/process_table_model.cpp b/deepin-system-monitor-main/model/process_table_model.cpp index dea926cd..0d764091 100644 --- a/deepin-system-monitor-main/model/process_table_model.cpp +++ b/deepin-system-monitor-main/model/process_table_model.cpp @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later - +#include "ddlog.h" #include "process_table_model.h" #include "process/process_db.h" #include "common/common.h" @@ -15,13 +15,16 @@ #include using namespace common; using namespace common::format; +using namespace DDLog; +DGUI_USE_NAMESPACE // using namespace Dtk::Gui; // model constructor ProcessTableModel::ProcessTableModel(QObject *parent, const QString &username) : QAbstractTableModel(parent) { setUserModeName(username); - qInfo() << "ProcessTableModel Constructor line 41:" << "new model with name" << username; + qCInfo(app) << "ProcessTableModel Constructor line 41:" + << "new model with name" << username; //update model's process list cache on process list updated signal auto *monitor = ThreadManager::instance()->thread(BaseThread::kSystemMonitorThread)->systemMonitorInstance(); connect(monitor, &SystemMonitor::statInfoUpdated, this, &ProcessTableModel::updateProcessList); @@ -46,7 +49,7 @@ ProcessTableModel::ProcessTableModel(QObject *parent, const QString &username) if (!theme) { theme = DGuiApplicationHelper::instance()->applicationTheme(); - connect(theme, &DPlatformTheme::iconThemeNameChanged, this, [ = ]() { + connect(theme, &DPlatformTheme::iconThemeNameChanged, this, [=]() { updateProcessList(); }); } @@ -85,7 +88,6 @@ void ProcessTableModel::updateProcessListWithUserSpecified() ProcessSet *processSet = ProcessDB::instance()->processSet(); const QList &newpidlst = processSet->getPIDList(); - beginRemoveRows({}, 0, m_procIdList.size()); endRemoveRows(); m_procIdList.clear(); @@ -236,13 +238,13 @@ QVariant ProcessTableModel::data(const QModelIndex &index, int role) const switch (proc.state()) { case 'Z': name = QString("(%1) %2") - .arg(QApplication::translate("Process.Table", "No response")) - .arg(name); + .arg(QApplication::translate("Process.Table", "No response")) + .arg(name); break; case 'T': name = QString("(%1) %2") - .arg(QApplication::translate("Process.Table", "Suspend")) - .arg(name); + .arg(QApplication::translate("Process.Table", "Suspend")) + .arg(name); break; } return name; @@ -350,7 +352,11 @@ QVariant ProcessTableModel::data(const QModelIndex &index, int role) const } else if (role == Qt::UserRole + 3) { return proc.appType(); } else if (role == Qt::UserRole + 4) { - return QString("%1").arg(proc.pid()); + QString cmdlineStr = proc.cmdlineString(); + if (!cmdlineStr.isEmpty()) + return cmdlineStr; + else + return QString("%1").arg(proc.name()); } return {}; } @@ -385,6 +391,7 @@ int ProcessTableModel::getProcessPriorityValue(pid_t pid) const // remove process entry from model with specified pid void ProcessTableModel::removeProcess(pid_t pid) { + qCWarning(app) << m_procIdList.count() << "1"; int row = m_procIdList.indexOf(pid); if (row >= 0) { beginRemoveRows(QModelIndex(), row, row); @@ -414,7 +421,6 @@ void ProcessTableModel::updateProcessPriority(pid_t pid, int priority) } } - void ProcessTableModel::setUserModeName(const QString &userName) { if (userName != m_userModeName) { @@ -456,8 +462,6 @@ qreal ProcessTableModel::getTotalUpload() return upload; } - - qreal ProcessTableModel::getTotalVirtualMemoryUsage() { qlonglong vtmem = 0; @@ -489,4 +493,4 @@ qreal ProcessTableModel::getTotalDiskWrite() diskwrite += proc.writeBps(); } return diskwrite; -} \ No newline at end of file +} diff --git a/deepin-system-monitor-main/network_monitor.cpp b/deepin-system-monitor-main/network_monitor.cpp index acc08a35..028befae 100644 --- a/deepin-system-monitor-main/network_monitor.cpp +++ b/deepin-system-monitor-main/network_monitor.cpp @@ -263,7 +263,8 @@ void NetworkMonitor::paintEvent(QPaintEvent *) qreal space = 2; dashes << 2 << space; gridPen.setColor(m_frameColor); - gridPen.setWidth(penSize); + //set to 0 lead to line with always 1px + gridPen.setWidth(0); gridPen.setDashPattern(dashes); painter.setPen(gridPen); diff --git a/deepin-system-monitor-main/process/desktop_entry_cache.cpp b/deepin-system-monitor-main/process/desktop_entry_cache.cpp index 2c8c7196..f4a7f307 100644 --- a/deepin-system-monitor-main/process/desktop_entry_cache.cpp +++ b/deepin-system-monitor-main/process/desktop_entry_cache.cpp @@ -39,6 +39,11 @@ const DesktopEntry DesktopEntryCache::entryWithDesktopFile(const QString &deskto return entry; } +QHash DesktopEntryCache::getCache() +{ + return m_cache; +} + void DesktopEntryCache::updateCache() { m_cache.clear(); diff --git a/deepin-system-monitor-main/process/desktop_entry_cache.h b/deepin-system-monitor-main/process/desktop_entry_cache.h index 08dcd8df..a4aa690e 100644 --- a/deepin-system-monitor-main/process/desktop_entry_cache.h +++ b/deepin-system-monitor-main/process/desktop_entry_cache.h @@ -32,6 +32,7 @@ class DesktopEntryCache const DesktopEntry entry(const QString &name) const; const DesktopEntry entryWithDesktopFile(const QString &desktopFile); const DesktopEntry entryWithSubName(const QString &subName) const; + QHash getCache(); void updateCache(); diff --git a/deepin-system-monitor-main/process/process.cpp b/deepin-system-monitor-main/process/process.cpp index b3f5cdc6..b47b204e 100644 --- a/deepin-system-monitor-main/process/process.cpp +++ b/deepin-system-monitor-main/process/process.cpp @@ -638,7 +638,10 @@ void Process::readSockInodes() if (!stat(fdp, &sbuf)) { // get inode if it's a socket descriptor if (S_ISSOCK(sbuf.st_mode)) { - d->sockInodes << sbuf.st_ino; + // not append repeat data, may memory leak. + if (!d->sockInodes.contains(sbuf.st_ino)) { + d->sockInodes << sbuf.st_ino; + } } } // ::if(stat) } // ::if(isdigit) diff --git a/deepin-system-monitor-main/process/process_db.cpp b/deepin-system-monitor-main/process/process_db.cpp index 15815db7..3a3454b4 100644 --- a/deepin-system-monitor-main/process/process_db.cpp +++ b/deepin-system-monitor-main/process/process_db.cpp @@ -220,7 +220,7 @@ void ProcessDB::sendSignalToProcess(pid_t pid, int signal) } else if (signal == SIGKILL) { Q_EMIT processKilled(pid); } else { - qWarning() << "Unexpected signal in this case:" << signal; + qCWarning(app) << "Unexpected signal in this case:" << signal; } }; auto fmsg = [ = ](int signal) -> QString { @@ -290,6 +290,7 @@ void ProcessDB::sendSignalToProcess(pid_t pid, int signal) errno, QApplication::translate("Process.Signal", "Failed in sending signal to process"), pid, SIGCONT, ec); + qCWarning(app) << "Failed in sending signal to process! process id:" << pid; Q_EMIT processControlResultReady(ec); return; } diff --git a/deepin-system-monitor-main/process/process_icon.cpp b/deepin-system-monitor-main/process/process_icon.cpp index 5be44806..951c0536 100644 --- a/deepin-system-monitor-main/process/process_icon.cpp +++ b/deepin-system-monitor-main/process/process_icon.cpp @@ -115,10 +115,21 @@ struct icon_data_t *ProcessIcon::terminalIconData(const QString &procname) const return iconData; } +QString ProcessIcon::getFileManagerString() +{ + DesktopEntryCache *desktopEntryCache = ProcessDB::instance()->desktopEntryCache(); + QList desktopEntryKeys = desktopEntryCache->getCache().keys(); + for (auto it = desktopEntryKeys.begin(); it != desktopEntryKeys.end(); it++) { + if ((*it).contains("dde-file-manager") && desktopEntryCache->getCache().value((*it))->icon.contains("dde-file-manager")) { + return (*it); + } + } + return ""; +} + std::shared_ptr ProcessIcon::getIcon(Process *proc) { std::shared_ptr iconDataPtr; - auto processDB = ProcessDB::instance(); WMWindowList *windowList = processDB->windowList(); DesktopEntryCache *desktopEntryCache = processDB->desktopEntryCache(); @@ -159,7 +170,14 @@ std::shared_ptr ProcessIcon::getIcon(Process *proc) iconData->desktopentry = true; iconData->type = kIconDataNameType; iconData->proc_name = proc->name(); - iconData->icon_name = entry->icon; + //由于文件管理器和主目录在desktopEntryCache的m_cache中的key都包含"dde-file-manager" + //且value中的结构体里的name都是"dde-file-manager",所以在这里对于文件管理器的图标要多做判断 + QString tempString = getFileManagerString(); + if (tempString.contains(proc->name())) { + iconData->icon_name = desktopEntryCache->getCache().value(tempString)->icon; + } else { + iconData->icon_name = entry->icon; + } iconDataPtr.reset(iconData); windowList->addDesktopEntryApp(proc); return iconDataPtr; diff --git a/deepin-system-monitor-main/process/process_icon.h b/deepin-system-monitor-main/process/process_icon.h index a1bf16d2..38227c59 100644 --- a/deepin-system-monitor-main/process/process_icon.h +++ b/deepin-system-monitor-main/process/process_icon.h @@ -29,6 +29,7 @@ class ProcessIcon std::shared_ptr getIcon(Process *proc); struct icon_data_t *defaultIconData(const QString &procname) const; struct icon_data_t *terminalIconData(const QString &procname) const; + QString getFileManagerString(); private: std::shared_ptr m_data; diff --git a/deepin-system-monitor-main/process/process_set.cpp b/deepin-system-monitor-main/process/process_set.cpp index 0d1b3049..fefd01df 100644 --- a/deepin-system-monitor-main/process/process_set.cpp +++ b/deepin-system-monitor-main/process/process_set.cpp @@ -104,20 +104,21 @@ void ProcessSet::scanProcess() m_prePid.removeAt(pid); //remove disappear process pid if(m_simpleSet.contains(pid)) m_simpleSet.remove(pid); + //for each pid,only one process reflected.So "removeOne()"func replied. if(m_pidMyApps.contains(pid)) - m_pidMyApps.removeAt(pid); + m_pidMyApps.removeOne(pid); } } for (const pid_t &pid : m_curPid) { if(!m_prePid.contains(pid)){ //add new process pid - Process *proc = new Process(pid); - proc->readProcessSimpleInfo(); + Process proc(pid); + proc.readProcessSimpleInfo(); if(!m_simpleSet.contains(pid)) - m_simpleSet.insert(proc->pid(), *proc); + m_simpleSet.insert(proc.pid(), proc); - if (proc->appType() == kFilterApps && !wmwindowList->isTrayApp(proc->pid())) { - m_pidMyApps << proc->pid(); + if (proc.appType() == kFilterApps && !wmwindowList->isTrayApp(proc.pid())) { + m_pidMyApps << proc.pid(); } } } diff --git a/deepin-system-monitor-main/service/service_manager.cpp b/deepin-system-monitor-main/service/service_manager.cpp index ab231fc9..4f05be1e 100644 --- a/deepin-system-monitor-main/service/service_manager.cpp +++ b/deepin-system-monitor-main/service/service_manager.cpp @@ -3,7 +3,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "service_manager.h" - +#include "ddlog.h" #include "application.h" #include "dbus/dbus_common.h" #include "dbus/dbus_properties_interface.h" @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include @@ -37,10 +39,36 @@ DCORE_USE_NAMESPACE using namespace dbus::common; - +using namespace DDLog; std::atomic ServiceManager::m_instance; std::mutex ServiceManager::m_mutex; +/** + @brief 非开发者模式下,使用后端 DBus 服务设置 systemd 服务 \a serviceName 的启动模式 + */ +static bool setServiceEnable(const QString &servieName, bool enable, QString &errorString) +{ + QDBusInterface interface("org.deepin.SystemMonitorSystemServer", + "/org/deepin/SystemMonitorSystemServer", + "org.deepin.SystemMonitorSystemServer", + QDBusConnection::systemBus()); + QDBusReply retMsg = interface.call("setServiceEnable", servieName, enable); + errorString.clear(); + if (!retMsg.isValid()) { + errorString = retMsg.error().message(); + } else if (!retMsg.value().isEmpty()) { + errorString = retMsg.value(); + } + + if (!errorString.isEmpty()) { + qCWarning(app) << QString("Set service %1 failed, error %1").arg(enable ? "enable" : "disable").arg(errorString); + return false; + } else { + qCDebug(app) << QString("Set service %1 ret: %2").arg(enable ? "enable" : "disable").arg(retMsg.value()); + return true; + } +} + CustomTimer::CustomTimer(ServiceManager *mgr, QObject *parent) : QObject(parent), m_mgr(mgr) { @@ -49,7 +77,7 @@ CustomTimer::CustomTimer(ServiceManager *mgr, QObject *parent) void CustomTimer::start(const QString &path) { - connect(m_timer, &QTimer::timeout, this, [ = ]() { + connect(m_timer, &QTimer::timeout, this, [=]() { SystemServiceEntry e = m_mgr->updateServiceEntry(path); if (m_cnt >= 6 || isFinalState(e.getActiveState().toLocal8Bit())) { m_timer->stop(); @@ -98,9 +126,9 @@ QString ServiceManager::normalizeServiceId(const QString &id, const QString &par if (buf.lastIndexOf('@') > 0) { if (!param.isEmpty()) buf = QString("%1%2%3") - .arg(buf.left(buf.lastIndexOf('@') + 1)) - .arg(param) - .arg(UnitTypeServiceSuffix); + .arg(buf.left(buf.lastIndexOf('@') + 1)) + .arg(param) + .arg(UnitTypeServiceSuffix); } } else { if (buf.endsWith('@') && !param.isEmpty()) { @@ -127,7 +155,7 @@ ErrorContext ServiceManager::startService(const QString &id, auto oResult = iface.StartUnit(buf, mode); ec = oResult.first; if (ec) { - qDebug() << "StartUnit failed:" << buf << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "StartUnit failed:" << buf << ec.getErrorName() << ec.getErrorMessage(); return ec; } QDBusObjectPath o = oResult.second; @@ -143,7 +171,7 @@ ErrorContext ServiceManager::startService(const QString &id, auto o1 = Systemd1UnitInterface::normalizeUnitPath(buf); entry = updateServiceEntry(o1.path()); } else { - qDebug() << "GetUnit failed:" << buf << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "GetUnit failed:" << buf << ec.getErrorName() << ec.getErrorMessage(); return ec; } } else { @@ -152,7 +180,7 @@ ErrorContext ServiceManager::startService(const QString &id, } if (!isFinalState(entry.getActiveState().toLocal8Bit())) { - auto *timer = new CustomTimer {this}; + auto *timer = new CustomTimer { this }; timer->start(o.path()); } @@ -172,7 +200,7 @@ ErrorContext ServiceManager::stopService(const QString &id) auto oResult = iface.StopUnit(buf, mode); ec = oResult.first; if (ec) { - qDebug() << "Stop Unit failed:" << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "Stop Unit failed:" << ec.getErrorName() << ec.getErrorMessage(); return ec; } QDBusObjectPath o = oResult.second; @@ -188,7 +216,7 @@ ErrorContext ServiceManager::stopService(const QString &id) auto o1 = Systemd1UnitInterface::normalizeUnitPath(buf); entry = updateServiceEntry(o1.path()); } else { - qDebug() << "Get Unit failed:" << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "Get Unit failed:" << ec.getErrorName() << ec.getErrorMessage(); return ec; } } else { @@ -197,7 +225,7 @@ ErrorContext ServiceManager::stopService(const QString &id) } if (!isFinalState(entry.getActiveState().toLocal8Bit())) { - auto *timer = new CustomTimer {this}; + auto *timer = new CustomTimer { this }; timer->start(o.path()); } @@ -217,7 +245,7 @@ ErrorContext ServiceManager::restartService(const QString &id, const QString &pa auto oResult = iface.RestartUnit(buf, mode); ec = oResult.first; if (ec) { - qDebug() << "Restart Unit failed:" << buf << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "Restart Unit failed:" << buf << ec.getErrorName() << ec.getErrorMessage(); return ec; } QDBusObjectPath o = oResult.second; @@ -233,7 +261,7 @@ ErrorContext ServiceManager::restartService(const QString &id, const QString &pa auto o1 = Systemd1UnitInterface::normalizeUnitPath(buf); entry = updateServiceEntry(o1.path()); } else { - qDebug() << "Get Unit failed:" << buf << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "Get Unit failed:" << buf << ec.getErrorName() << ec.getErrorMessage(); return ec; } } else { @@ -242,7 +270,7 @@ ErrorContext ServiceManager::restartService(const QString &id, const QString &pa } if (!isFinalState(entry.getActiveState().toLocal8Bit())) { - auto *timer = new CustomTimer {this}; + auto *timer = new CustomTimer { this }; timer->start(o.path()); } @@ -260,30 +288,29 @@ ErrorContext ServiceManager::setServiceStartupMode(const QString &id, bool autoS Systemd1ManagerInterface mgrIf(DBUS_SYSTEMD1_SERVICE, kSystemDObjectPath.path(), QDBusConnection::systemBus()); if (autoStart) { - auto re = mgrIf.EnableUnitFiles({entry.getId()}); + auto re = mgrIf.EnableUnitFiles({ entry.getId() }); ec = re.first; if (ec) { - qDebug() << "call EnableUnitFiles failed:" << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "call EnableUnitFiles failed:" << ec.getErrorName() << ec.getErrorMessage(); return ec; } auto eResult = re.second; } else { - auto re = mgrIf.DisableUnitFiles({entry.getId()}); + auto re = mgrIf.DisableUnitFiles({ entry.getId() }); ec = re.first; if (ec) { - qDebug() << "call DisableUnitFiles failed:" << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "call DisableUnitFiles failed:" << ec.getErrorName() << ec.getErrorMessage(); return ec; } auto dResult = re.second; } #else - auto errfmt = [ = ](ErrorContext & pe, decltype(errno) err, const QString & title, const QString &message = {}) -> ErrorContext & { + auto errfmt = [=](ErrorContext &pe, decltype(errno) err, const QString &title, const QString &message = {}) -> ErrorContext & { pe.setCode(ErrorContext::kErrorTypeSystem); pe.setSubCode(err); pe.setErrorName(title); auto errmsg = (err != 0 ? QString("Error: [%1] %2").arg(err).arg(strerror(err)) : QString("Error: ")); - if (!message.isEmpty()) - { + if (!message.isEmpty()) { errmsg = QString("%1 - %2").arg(errmsg).arg(message); } pe.setErrorMessage(errmsg); @@ -299,7 +326,7 @@ ErrorContext ServiceManager::setServiceStartupMode(const QString &id, bool autoS sbuf = {}; rc = stat(BIN_PKEXEC_PATH, &sbuf); if (rc == -1) { - qDebug() << "check pkexec existence failed"; + qCDebug(app) << "check pkexec existence failed"; ec = errfmt(ec, errno, title, BIN_PKEXEC_PATH); return ec; } @@ -309,7 +336,7 @@ ErrorContext ServiceManager::setServiceStartupMode(const QString &id, bool autoS sbuf = {}; rc = stat(BIN_SYSTEMCTL_PATH, &sbuf); if (rc == -1) { - qDebug() << "check systemctl existence failed"; + qCDebug(app) << "check systemctl existence failed"; ec = errfmt(ec, errno, title, BIN_SYSTEMCTL_PATH); return ec; } @@ -324,61 +351,80 @@ ErrorContext ServiceManager::setServiceStartupMode(const QString &id, bool autoS proc.setProcessChannelMode(QProcess::MergedChannels); // {BIN_PKEXEC_PATH} {BIN_SYSTEMCTL_PATH} {enable/disable} {service} QString action = autoStart ? "enable" : "disable"; + bool useProcess = true; if (developerMode) { - proc.start(BIN_PKEXEC_PATH, {BIN_SYSTEMCTL_PATH, action, id}); + proc.start(BIN_PKEXEC_PATH, { BIN_SYSTEMCTL_PATH, action, id }); } else { + // Bug 241793 非开发者模式,使用后端DBus服务设置启动方式 +#if 0 proc.start(BIN_SYSTEMCTL_PATH, {action, id}); +#else + useProcess = false; + QString errorString; + bool dbusRet = setServiceEnable(id, autoStart, errorString); + if (!dbusRet) { + errno = 0; + ErrorContext errCtx {}; + errCtx = errfmt(errCtx, errno, title, errorString); + return errCtx; + } +#endif } - proc.waitForFinished(-1); - auto exitStatus = proc.exitStatus(); + ErrorContext le {}; - // exitStatus: - // crashed - // - // exitCode: - // 127 (pkexec) - not auth/cant auth/error - // 126 (pkexec) - auth dialog dismissed - // 0 (systemctl) - ok - // !0 (systemctl) - systemctl error, read stdout from child process - if (exitStatus == QProcess::CrashExit) { - errno = 0; - le = errfmt(le, errno, title, QApplication::translate("Service.Action.Set.Startup.Mode", - "Error: Failed to set service startup type due to the crashed sub process.")); - return le; - } else { - auto exitCode = proc.exitCode(); - if (exitCode == 127 || exitCode == 126) { - errno = EPERM; - le = errfmt(le, errno, title); - return le; - } else if (exitCode != 0) { - auto buf = proc.readAllStandardOutput(); + if (useProcess) { + proc.waitForFinished(-1); + auto exitStatus = proc.exitStatus(); + + // exitStatus: + // crashed + // + // exitCode: + // 127 (pkexec) - not auth/cant auth/error + // 126 (pkexec) - auth dialog dismissed + // 0 (systemctl) - ok + // !0 (systemctl) - systemctl error, read stdout from child process + if (exitStatus == QProcess::CrashExit) { errno = 0; - le = errfmt(le, errno, title, buf); + le = errfmt(le, errno, title, QApplication::translate("Service.Action.Set.Startup.Mode", "Error: Failed to set service startup type due to the crashed sub process.")); return le; } else { - // success - refresh service stat -send signal - - // special case, do nothing there - if (id.endsWith("@")) - return ErrorContext(); - - Systemd1ManagerInterface mgrIf(DBUS_SYSTEMD1_SERVICE, - kSystemDObjectPath.path(), - QDBusConnection::systemBus()); - auto buf = normalizeServiceId(id, {}); - auto re = mgrIf.GetUnit(buf); - le = re.first; - if (le) { - if (le.getCode() == 3) { - auto o = Systemd1UnitInterface::normalizeUnitPath(buf); - updateServiceEntry(o.path()); - } else { - return le; - } + auto exitCode = proc.exitCode(); + if (exitCode == 127 || exitCode == 126) { + errno = EPERM; + le = errfmt(le, errno, title); + return le; + } else if (exitCode != 0) { + auto buf = proc.readAllStandardOutput(); + errno = 0; + le = errfmt(le, errno, title, buf); + return le; + } + } + } + + { + // success - refresh service stat -send signal + + // special case, do nothing there + if (id.endsWith("@")) + return ErrorContext(); + + Systemd1ManagerInterface mgrIf(DBUS_SYSTEMD1_SERVICE, + kSystemDObjectPath.path(), + QDBusConnection::systemBus()); + auto buf = normalizeServiceId(id, {}); + auto re = mgrIf.GetUnit(buf); + le = re.first; + if (le) { + if (le.getCode() == 3) { + auto o = Systemd1UnitInterface::normalizeUnitPath(buf); + updateServiceEntry(o.path()); } else { - updateServiceEntry(re.second.path()); + return le; } + } else { + updateServiceEntry(re.second.path()); } } #endif @@ -405,7 +451,7 @@ SystemServiceEntry ServiceManager::updateServiceEntry(const QString &opath) QString id = idResult.second; auto sname = id; if (ec) { - qDebug() << "getId failed:" << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "getId failed:" << ec.getErrorName() << ec.getErrorMessage(); } else { if (sname.endsWith(UnitTypeServiceSuffix)) { sname.chop(strlen(UnitTypeServiceSuffix)); @@ -417,7 +463,7 @@ SystemServiceEntry ServiceManager::updateServiceEntry(const QString &opath) auto loadStateResult = unitIf.getLoadState(); ec = loadStateResult.first; if (ec) { - qDebug() << "getLoadState failed:" << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "getLoadState failed:" << ec.getErrorName() << ec.getErrorMessage(); } else { entry.setLoadState(loadStateResult.second); } @@ -425,7 +471,7 @@ SystemServiceEntry ServiceManager::updateServiceEntry(const QString &opath) auto activeStateResult = unitIf.getActiveState(); ec = activeStateResult.first; if (ec) { - qDebug() << "getActiveState failed:" << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "getActiveState failed:" << ec.getErrorName() << ec.getErrorMessage(); } else { entry.setActiveState(activeStateResult.second); } @@ -433,7 +479,7 @@ SystemServiceEntry ServiceManager::updateServiceEntry(const QString &opath) auto subStateResult = unitIf.getSubState(); ec = subStateResult.first; if (ec) { - qDebug() << "getSubState failed:" << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "getSubState failed:" << ec.getErrorName() << ec.getErrorMessage(); } else { entry.setSubState(subStateResult.second); } @@ -441,19 +487,19 @@ SystemServiceEntry ServiceManager::updateServiceEntry(const QString &opath) auto unitFileStateResult = mgrIf.GetUnitFileState(id); ec = unitFileStateResult.first; if (ec) { - qDebug() << "getUnitFileState failed:" << entry.getId() << ec.getErrorName() - << ec.getErrorMessage(); + qCDebug(app) << "getUnitFileState failed:" << entry.getId() << ec.getErrorName() + << ec.getErrorMessage(); } else { entry.setState(unitFileStateResult.second); entry.setStartupType(ServiceManager::getServiceStartupType( - entry.getSName(), - entry.getState())); + entry.getSName(), + entry.getState())); } auto descResult = unitIf.getDescription(); ec = descResult.first; if (ec) { - qDebug() << "getDescription failed:" << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "getDescription failed:" << ec.getErrorName() << ec.getErrorMessage(); } else { entry.setDescription(descResult.second); } @@ -461,7 +507,7 @@ SystemServiceEntry ServiceManager::updateServiceEntry(const QString &opath) auto mainPIDResult = svcIf.getMainPID(); ec = mainPIDResult.first; if (ec) { - qDebug() << "getMainPID failed:" << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "getMainPID failed:" << ec.getErrorName() << ec.getErrorMessage(); } else { entry.setMainPID(mainPIDResult.second); } @@ -469,7 +515,7 @@ SystemServiceEntry ServiceManager::updateServiceEntry(const QString &opath) auto canStartResult = unitIf.canStart(); ec = canStartResult.first; if (ec) { - qDebug() << "canStart failed:" << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "canStart failed:" << ec.getErrorName() << ec.getErrorMessage(); } else { entry.setCanStart(canStartResult.second); } @@ -477,7 +523,7 @@ SystemServiceEntry ServiceManager::updateServiceEntry(const QString &opath) auto canStopResult = unitIf.canStop(); ec = canStopResult.first; if (ec) { - qDebug() << "canStop failed:" << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "canStop failed:" << ec.getErrorName() << ec.getErrorMessage(); } else { entry.setCanStop(canStopResult.second); } @@ -485,7 +531,7 @@ SystemServiceEntry ServiceManager::updateServiceEntry(const QString &opath) auto canReloadResult = unitIf.canReload(); ec = canReloadResult.first; if (ec) { - qDebug() << "canReload failed:" << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "canReload failed:" << ec.getErrorName() << ec.getErrorMessage(); } else { entry.setCanReload(canReloadResult.second); } diff --git a/deepin-system-monitor-main/service/service_manager_worker.cpp b/deepin-system-monitor-main/service/service_manager_worker.cpp index a5744a7d..d18a9ed8 100644 --- a/deepin-system-monitor-main/service/service_manager_worker.cpp +++ b/deepin-system-monitor-main/service/service_manager_worker.cpp @@ -3,7 +3,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "service_manager_worker.h" - +#include "ddlog.h" #include "dbus/dbus_common.h" #include "dbus/dbus_properties_interface.h" #include "dbus/environment_file.h" @@ -18,7 +18,9 @@ #include #include -ServiceManagerWorker::ServiceManagerWorker(QObject *parent) : QObject(parent) +using namespace DDLog; +ServiceManagerWorker::ServiceManagerWorker(QObject *parent) + : QObject(parent) { } @@ -36,14 +38,14 @@ void ServiceManagerWorker::startJob() auto unitFilesResult = mgrIf.ListUnitFiles(); ec = unitFilesResult.first; if (ec) { - qDebug() << "ListUnitFiles failed:" << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "ListUnitFiles failed:" << ec.getErrorName() << ec.getErrorMessage(); } UnitFileInfoList unitFiles = unitFilesResult.second; auto unitsResult = mgrIf.ListUnits(); ec = unitsResult.first; if (ec) { - qDebug() << "ListUnits failed:" << ec.getErrorName() << ec.getErrorMessage(); + qCDebug(app) << "ListUnits failed:" << ec.getErrorName() << ec.getErrorMessage(); } UnitInfoList units = unitsResult.second; for (auto u : units) { @@ -54,12 +56,12 @@ void ServiceManagerWorker::startJob() // filter-out non service type units std::function fltUnits; - fltUnits = [](const UnitInfo & unit) -> bool { + fltUnits = [](const UnitInfo &unit) -> bool { return unit.getName().endsWith(UnitTypeServiceSuffix); }; - std::function mapUnit = [&mgrIf](const UnitInfo & unit) { - ErrorContext ec1{}; - SystemServiceEntry entry{}; + std::function mapUnit = [&mgrIf](const UnitInfo &unit) { + ErrorContext ec1 {}; + SystemServiceEntry entry {}; // SName entry.setSName(unit.getName().left(unit.getName().lastIndexOf('.'))); // LoadState @@ -79,7 +81,7 @@ void ServiceManagerWorker::startJob() auto id = unitIf.getId(); ec1 = id.first; if (ec1) { - qDebug() << "call getId failed:" << ec1.getErrorName() << ec1.getErrorMessage(); + qCDebug(app) << "call getId failed:" << ec1.getErrorName() << ec1.getErrorMessage(); } else { entry.setId(id.second); } @@ -87,7 +89,7 @@ void ServiceManagerWorker::startJob() auto bStart = unitIf.canStart(); ec1 = bStart.first; if (ec1) { - qDebug() << "call canStart failed:" << ec1.getErrorName() << ec1.getErrorMessage(); + qCDebug(app) << "call canStart failed:" << ec1.getErrorName() << ec1.getErrorMessage(); } else { entry.setCanStart(bStart.second); } @@ -95,7 +97,7 @@ void ServiceManagerWorker::startJob() auto bStop = unitIf.canStop(); ec1 = bStop.first; if (ec1) { - qDebug() << "call canStart failed:" << ec1.getErrorName() << ec1.getErrorMessage(); + qCDebug(app) << "call canStart failed:" << ec1.getErrorName() << ec1.getErrorMessage(); } else { entry.setCanStop(bStop.second); } @@ -103,7 +105,7 @@ void ServiceManagerWorker::startJob() auto bReload = unitIf.canReload(); ec1 = bReload.first; if (ec1) { - qDebug() << "call canStart failed:" << ec1.getErrorName() << ec1.getErrorMessage(); + qCDebug(app) << "call canStart failed:" << ec1.getErrorName() << ec1.getErrorMessage(); } else { entry.setCanReload(bReload.second); } @@ -115,7 +117,7 @@ void ServiceManagerWorker::startJob() auto pid = svcIf.getMainPID(); ec1 = pid.first; if (ec1) { - qDebug() << "getMainPID failed" << ec1.getErrorName() << ec1.getErrorMessage(); + qCDebug(app) << "getMainPID failed" << ec1.getErrorName() << ec1.getErrorMessage(); } else { entry.setMainPID(pid.second); } @@ -124,48 +126,46 @@ void ServiceManagerWorker::startJob() auto state = mgrIf.GetUnitFileState(unit.getName()); ec1 = state.first; if (ec1) { - qDebug() << "getUnitFileState failed" << ec1.getErrorName() << ec1.getErrorMessage(); + qCDebug(app) << "getUnitFileState failed" << ec1.getErrorName() << ec1.getErrorMessage(); } else { entry.setState(state.second); } // startupType entry.setStartupType(ServiceManager::getServiceStartupType( - entry.getSName(), - entry.getState())); + entry.getSName(), + entry.getState())); return entry; }; - std::function &elist, const SystemServiceEntry &entry)> addServiceEntryFromUnitInfo; - addServiceEntryFromUnitInfo = [](QList &elist, const SystemServiceEntry & entry) { + std::function & elist, const SystemServiceEntry &entry)> addServiceEntryFromUnitInfo; + addServiceEntryFromUnitInfo = [](QList &elist, const SystemServiceEntry &entry) { elist << entry; }; auto fltufe = QtConcurrent::filter(units, fltUnits); fltufe.waitForFinished(); auto ufe = QtConcurrent::mappedReduced>(units, mapUnit, addServiceEntryFromUnitInfo); - std::function &elist, const SystemServiceEntry &entry)> addServiceEntryFromUnitFileInfo; - addServiceEntryFromUnitFileInfo = [&hash](QList &elist, const SystemServiceEntry & entry) { + std::function & elist, const SystemServiceEntry &entry)> addServiceEntryFromUnitFileInfo; + addServiceEntryFromUnitFileInfo = [&hash](QList &elist, const SystemServiceEntry &entry) { if (!hash.contains(entry.getId())) { elist << entry; } }; // filter-out non service type unit-files std::function fltUnitFiles; - fltUnitFiles = [&hash](const UnitFileInfo & unitFile) -> bool { + fltUnitFiles = [&hash](const UnitFileInfo &unitFile) -> bool { auto id = unitFile.getName().mid(unitFile.getName().lastIndexOf('/') + 1); - if (hash.contains(id)) - { + if (hash.contains(id)) { return false; - } else - { + } else { return unitFile.getName().endsWith(UnitTypeServiceSuffix); } }; - std::function mapUnitFiles; - mapUnitFiles = [](const UnitFileInfo & unf) { - SystemServiceEntry entry{}; - ErrorContext ec1{}; + std::function mapUnitFiles; + mapUnitFiles = [](const UnitFileInfo &unf) { + SystemServiceEntry entry {}; + ErrorContext ec1 {}; auto id = unf.getName().mid(unf.getName().lastIndexOf('/') + 1); auto sname = id; @@ -174,8 +174,8 @@ void ServiceManagerWorker::startJob() entry.setSName(sname); entry.setState(unf.getStatus()); entry.setStartupType(ServiceManager::getServiceStartupType( - entry.getSName(), - entry.getState())); + entry.getSName(), + entry.getState())); if (sname.endsWith('@')) { // read description from unit file auto desc = readUnitDescriptionFromUnitFile(unf.getName()); @@ -193,7 +193,7 @@ void ServiceManagerWorker::startJob() auto id1 = unitIf.getId(); ec1 = id1.first; if (ec1) { - qDebug() << "call getId failed:" << ec1.getErrorName() << ec1.getErrorMessage(); + qCDebug(app) << "call getId failed:" << ec1.getErrorName() << ec1.getErrorMessage(); } else { entry.setId(id1.second); } @@ -201,7 +201,7 @@ void ServiceManagerWorker::startJob() auto desc = unitIf.getDescription(); ec1 = desc.first; if (ec1) { - qDebug() << "getDescription failed:" << ec1.getErrorName() << ec1.getErrorMessage(); + qCDebug(app) << "getDescription failed:" << ec1.getErrorName() << ec1.getErrorMessage(); } else { entry.setDescription(desc.second); } @@ -209,7 +209,7 @@ void ServiceManagerWorker::startJob() auto actState = unitIf.getActiveState(); ec1 = actState.first; if (ec1) { - qDebug() << "getActiveState failed:" << ec1.getErrorName() << ec1.getErrorMessage(); + qCDebug(app) << "getActiveState failed:" << ec1.getErrorName() << ec1.getErrorMessage(); } else { entry.setActiveState(actState.second); } @@ -217,7 +217,7 @@ void ServiceManagerWorker::startJob() auto loadState = unitIf.getLoadState(); ec1 = loadState.first; if (ec1) { - qDebug() << "getLoadState failed:" << ec1.getErrorName() << ec1.getErrorMessage(); + qCDebug(app) << "getLoadState failed:" << ec1.getErrorName() << ec1.getErrorMessage(); } else { entry.setLoadState(loadState.second); } @@ -225,7 +225,7 @@ void ServiceManagerWorker::startJob() auto subState = unitIf.getSubState(); ec1 = subState.first; if (ec1) { - qDebug() << "getSubState failed:" << ec1.getErrorName() << ec1.getErrorMessage(); + qCDebug(app) << "getSubState failed:" << ec1.getErrorName() << ec1.getErrorMessage(); } else { entry.setSubState(subState.second); } @@ -233,7 +233,7 @@ void ServiceManagerWorker::startJob() auto mainPID = svcIf.getMainPID(); ec1 = mainPID.first; if (ec1) { - qDebug() << "getMainPID failed:" << ec1.getErrorName() << ec1.getErrorMessage(); + qCDebug(app) << "getMainPID failed:" << ec1.getErrorName() << ec1.getErrorMessage(); } else { entry.setMainPID(mainPID.second); } @@ -255,19 +255,18 @@ void ServiceManagerWorker::startJob() QString ServiceManagerWorker::readUnitDescriptionFromUnitFile(const QString &path) { - FILE *fp {nullptr}; - const int BLEN {2048}; - QByteArray buf {BLEN, 0}; - QByteArray desc {BLEN, 0}; - bool b {false}; + FILE *fp { nullptr }; + const int BLEN { 2048 }; + QByteArray buf { BLEN, 0 }; + QByteArray desc { BLEN, 0 }; + bool b { false }; fp = fopen(path.toLocal8Bit(), "r"); QString descStr; - if (fp) - { + if (fp) { while ((fgets(buf.data(), BLEN, fp))) { descStr = QString("Description=%1").arg(buf.data()); - QStringList descStrList = descStr.split(QRegExp("[\n]"),QString::SkipEmptyParts); + QStringList descStrList = descStr.split(QRegExp("[\n]"), QString::SkipEmptyParts); if (descStrList.size() > 0) { descStr = descStrList.at(0); b = true; diff --git a/deepin-system-monitor-main/system/block_device_info_db.cpp b/deepin-system-monitor-main/system/block_device_info_db.cpp index 01220e5a..0b77c399 100644 --- a/deepin-system-monitor-main/system/block_device_info_db.cpp +++ b/deepin-system-monitor-main/system/block_device_info_db.cpp @@ -5,7 +5,7 @@ #include "block_device_info_db.h" #include "block_device.h" - +#include "ddlog.h" #include #include #include @@ -20,6 +20,8 @@ #include +using namespace DDLog; + #define SYSFS_PATH_VIRTUAL_BLOCK "/sys/devices/virtual/block" namespace core { @@ -97,7 +99,6 @@ BlockDeviceInfoDB::BlockDeviceInfoDB() BlockDeviceInfoDB::~BlockDeviceInfoDB() { - } void BlockDeviceInfoDB::readDiskInfo() @@ -115,21 +116,20 @@ void BlockDeviceInfoDB::readDiskInfo() int index = -1; // 查找当前的device是否存在 for (int si = 0; si < m_deviceList.size(); ++si) { - if (m_deviceList[si].deviceName() == list[i].fileName().toLocal8Bit()) { // 存在 + if (m_deviceList[si].deviceName() == list[i].fileName().toLocal8Bit()) { // 存在 index = si; break; } } - if (index == -1) { // 不存在的话将该disk存储起来 + if (index == -1) { // 不存在的话将该disk存储起来 BlockDevice bd; if (bd.readDeviceSize(list[i].fileName()) > 0) { bd.setDeviceName(list[i].fileName().toLocal8Bit()); m_deviceList << bd; } } else { - m_deviceList[index].setDeviceName(list[i].fileName().toLocal8Bit()); // 更新disk数据 + m_deviceList[index].setDeviceName(list[i].fileName().toLocal8Bit()); // 更新disk数据 } - } } @@ -140,21 +140,20 @@ void BlockDeviceInfoDB::readDiskInfo() int index = -1; // 查找当前的device是否存在 for (int si = 0; si < m_deviceList.size(); ++si) { - if (m_deviceList[si].deviceName() == list[i].fileName().toLocal8Bit()) { // 存在 + if (m_deviceList[si].deviceName() == list[i].fileName().toLocal8Bit()) { // 存在 index = si; break; } } - if (index == -1) { // 不存在的话将该disk存储起来 + if (index == -1) { // 不存在的话将该disk存储起来 BlockDevice bd; if (bd.readDeviceSize(list[i].fileName()) > 0) { bd.setDeviceName(list[i].fileName().toLocal8Bit()); m_deviceList << bd; } } else { - m_deviceList[index].setDeviceName(list[i].fileName().toLocal8Bit()); // 更新disk数据 + m_deviceList[index].setDeviceName(list[i].fileName().toLocal8Bit()); // 更新disk数据 } - } } @@ -170,10 +169,8 @@ void BlockDeviceInfoDB::readDiskInfo() m_deviceList.removeAt(i); } } - } - //static void enum_block() //{ // struct udev *udev; @@ -213,18 +210,18 @@ void BlockDeviceInfoDB::readDiskInfo() // path = udev_list_entry_get_name(dev_list_entry); // dev = udev_device_new_from_syspath(udev, path); -//// qDebug() << "devNode" << udev_device_get_devnode(dev); -//// qDebug() << "devType" << udev_device_get_devtype(dev); -//// qDebug() << "sysName" << udev_device_get_sysname(dev); -//// qDebug() << "devPath" << udev_device_get_devpath(dev); -//// qDebug() << "sysPath" << udev_device_get_syspath(dev); -//// qDebug() << "sysnum" << udev_device_get_sysnum(dev); -//// qDebug() << "subsystem" << udev_device_get_subsystem(dev); +//// qCDebug(app) << "devNode" << udev_device_get_devnode(dev); +//// qCDebug(app) << "devType" << udev_device_get_devtype(dev); +//// qCDebug(app) << "sysName" << udev_device_get_sysname(dev); +//// qCDebug(app) << "devPath" << udev_device_get_devpath(dev); +//// qCDebug(app) << "sysPath" << udev_device_get_syspath(dev); +//// qCDebug(app) << "sysnum" << udev_device_get_sysnum(dev); +//// qCDebug(app) << "subsystem" << udev_device_get_subsystem(dev); //// auto *parent = udev_device_get_parent(dev); -//// qDebug() << "parent sysname: " << udev_device_get_sysname(parent); -//// qDebug() << "parent devpath: " << udev_device_get_devpath(parent); -//// qDebug() << "parent syspath: " << udev_device_get_syspath(parent); +//// qCDebug(app) << "parent sysname: " << udev_device_get_sysname(parent); +//// qCDebug(app) << "parent devpath: " << udev_device_get_devpath(parent); +//// qCDebug(app) << "parent syspath: " << udev_device_get_syspath(parent); // // /* skip if device/disk is a partition or loop device */ // // if (strncmp(udev_device_get_devtype(dev), "partition", 9) != 0 && @@ -266,18 +263,18 @@ void BlockDeviceInfoDB::update() // TODO: enum device in /sys/block => phy & virtual // TEST begin (move udev logic to udev & udevice) -// enum_block(); + // enum_block(); -// struct udev *udev = udev_new(); + // struct udev *udev = udev_new(); -// enumerate_usb_mass_storage(udev); + // enumerate_usb_mass_storage(udev); -// udev_unref(udev); -// // TEST end + // udev_unref(udev); + // // TEST end -// QWriteLocker lock(&m_rwlock); + // QWriteLocker lock(&m_rwlock); // update device list } -} // namespace system -} // namespace core +} // namespace system +} // namespace core diff --git a/deepin-system-monitor-main/system/cpu_set.cpp b/deepin-system-monitor-main/system/cpu_set.cpp index 311fd44a..ca550f95 100644 --- a/deepin-system-monitor-main/system/cpu_set.cpp +++ b/deepin-system-monitor-main/system/cpu_set.cpp @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later - +#include "ddlog.h" #include "cpu_set.h" #include "private/cpu_set_p.h" @@ -17,7 +17,6 @@ extern "C" { #include "../3rdparty/include/xalloc.h" } - #include #include #include @@ -34,12 +33,41 @@ extern "C" { using namespace common::error; using namespace common::alloc; using namespace common::init; +using namespace DDLog; static bool read_dmi_cache = false; namespace core { namespace system { +/** + @brief 获取首个有效CPU的当前频率,参考 util-linux 中 lscpu 读取 /proc/cpuinfo 的首个 cpu 的 mhz 信息。 + @note 1. 参考 lsblk_cputype_get_scalmhz 函数,过滤无效cpu + 2. 上游的 lscpu 不再提供 'CPU MHz' 而是 'CPU(s) scaling MHz' ,因为各个核心的频率不定,单纯取平均也存在出入; + 此处的实现参考 util-linux 2.33.1.20-1+dde 版本,取首个有效值,和 lscpu 指令保持一致。 + */ +static float first_avaliable_cur_freq(struct lscpu_cxt *cxt, const struct lscpu_cputype *ct) +{ + if (!cxt) + return 0.0f; + + size_t i; + + for (i = 0; i < cxt->npossibles; i++) { + struct lscpu_cpu *cpu = cxt->cpus[i]; + + if (!cpu || cpu->type != ct || !is_cpu_present(cxt, cpu)) + continue; + if (cpu->mhz_max_freq <= 0.0f || cpu->mhz_cur_freq <= 0.0f) + continue; + if (cpu->mhz_cur_freq <= 0.0f) + continue; + return cpu->mhz_cur_freq; + } + + return 0.0f; +} + static void lscpu_free_context(struct lscpu_cxt *cxt) { size_t i; @@ -282,7 +310,6 @@ CPUSet &CPUSet::operator=(const CPUSet &rhs) CPUSet::~CPUSet() { - } QString CPUSet::modelName() const @@ -334,11 +361,8 @@ QString CPUSet::minFreq() const QString CPUSet::maxFreq() const { //获取最大CPU频率数值,单位MHz - qreal MaxFreq = mIsEmptyModelName ? - d->m_info.value(QStringLiteral("CPU 最大 MHz")).toDouble() : - d->m_info.value("CPU max MHz").toDouble(); + qreal MaxFreq = mIsEmptyModelName ? d->m_info.value(QStringLiteral("CPU 最大 MHz")).toDouble() : d->m_info.value("CPU max MHz").toDouble(); return common::format::formatHz(static_cast(MaxFreq), common::format::MHz); - } QString CPUSet::l1dCache() const @@ -447,7 +471,7 @@ void CPUSet::read_stats() if (!(fp = fopen(PROC_PATH_STAT, "r"))) { print_errno(errno, QString("open %1 failed").arg(PROC_PATH_STAT)); return; - } // ::if(fopen) + } // ::if(fopen) fPtr.reset(fp); while (fgets(line.data(), BUFSIZ, fp)) { @@ -473,7 +497,7 @@ void CPUSet::read_stats() if (nr == 10) { // usage calc - QByteArray cpu {"cpu"}; + QByteArray cpu { "cpu" }; d->m_stat->cpu = cpu; if (!d->m_usage) { @@ -485,10 +509,10 @@ void CPUSet::read_stats() d->m_usage->cpu = cpu; d->m_usage->total = d->m_stat->user + d->m_stat->nice + d->m_stat->sys + d->m_stat->idle + d->m_stat->iowait + d->m_stat->hardirq + d->m_stat->softirq + d->m_stat->steal; d->m_usage->idle = d->m_stat->idle + d->m_stat->iowait; - } // ::if(usage) + } // ::if(usage) } else print_errno(errno, QString("read %1 failed, cpu").arg(PROC_PATH_STAT)); - } // ::if(m_stat) + } // ::if(m_stat) } else if (!strncmp(line.data(), "cpu", 3)) { // per cpu stat in jiffies auto stat = std::make_shared(); @@ -509,7 +533,7 @@ void CPUSet::read_stats() &stat->guest_nice); if (nr == 11) { - QByteArray cpu {"cpu"}; + QByteArray cpu { "cpu" }; cpu.append(QByteArray::number(ncpu)); stat->cpu = cpu; @@ -523,14 +547,15 @@ void CPUSet::read_stats() d->m_statDB[stat->cpu] = stat; d->m_usageDB[usage->cpu] = usage; - } //::if(usage) + } //::if(usage) } else print_errno(errno, QString("read %1 failed, cpu%2").arg(PROC_PATH_STAT).arg(ncpu)); - } // ::if(stat) + } // ::if(stat) } else if (!strncmp(line.data(), "btime", 5)) { // read boot time in seconds since epoch - struct timeval btime { + struct timeval btime + { }; long nsec {}; int nm = sscanf(line.data() + 5, "%ld", &nsec); @@ -541,9 +566,9 @@ void CPUSet::read_stats() // set sysinfo btime auto *monitor = ThreadManager::instance()->thread(BaseThread::kSystemMonitorThread)->systemMonitorInstance(); monitor->sysInfo()->set_btime(btime); - } // ::if(nm == 1) - } // ::if(btime) - } // ::while(fgets) + } // ::if(nm == 1) + } // ::if(btime) + } // ::while(fgets) if (ferror(fp)) print_errno(errno, QString("read %1 failed").arg(PROC_PATH_STAT)); @@ -580,41 +605,40 @@ void CPUSet::read_overall_info() infos.append(info); } -// if (!cpuinfo.contains("model name")) { -// mIsEmptyModelName = true; -// infos.clear(); -// // 根据lscpu源码实现获取CPU信息 -// process.start("lscpu"); -// process.waitForFinished(3000); -// QString lscpu = process.readAllStandardOutput(); - -// QStringList lscpuList = lscpu.split("\n", QString::SkipEmptyParts); -// d->m_info.clear(); -// for (QString lscpuLine : lscpuList) { -// QStringList keyValue {}; -// if (lscpuLine.contains(":")){ -// keyValue = lscpuLine.split(":", QString::SkipEmptyParts); -// } else if (lscpuLine.contains(":")) { -// keyValue = lscpuLine.split(":", QString::SkipEmptyParts); -// } - -// if (keyValue.count() > 1) -// d->m_info[keyValue.value(0).trimmed()] = keyValue.value(1).trimmed(); -// } -// } -// else { -// mIsEmptyModelName = false; -// read_lscpu(); -// d->m_infos = infos; -// } + // if (!cpuinfo.contains("model name")) { + // mIsEmptyModelName = true; + // infos.clear(); + // // 根据lscpu源码实现获取CPU信息 + // process.start("lscpu"); + // process.waitForFinished(3000); + // QString lscpu = process.readAllStandardOutput(); + + // QStringList lscpuList = lscpu.split("\n", QString::SkipEmptyParts); + // d->m_info.clear(); + // for (QString lscpuLine : lscpuList) { + // QStringList keyValue {}; + // if (lscpuLine.contains(":")){ + // keyValue = lscpuLine.split(":", QString::SkipEmptyParts); + // } else if (lscpuLine.contains(":")) { + // keyValue = lscpuLine.split(":", QString::SkipEmptyParts); + // } + + // if (keyValue.count() > 1) + // d->m_info[keyValue.value(0).trimmed()] = keyValue.value(1).trimmed(); + // } + // } + // else { + // mIsEmptyModelName = false; + // read_lscpu(); + // d->m_infos = infos; + // } read_lscpu(); d->m_infos = infos; } void CPUSet::read_dmi_cache_info() { - if (read_dmi_cache || (d->m_info.contains("L1d cache") && d->m_info.contains("L1i cache") - && d->m_info.contains("L2 cache") && d->m_info.contains("L3 cache"))) { + if (read_dmi_cache || (d->m_info.contains("L1d cache") && d->m_info.contains("L1i cache") && d->m_info.contains("L2 cache") && d->m_info.contains("L3 cache"))) { read_dmi_cache = true; return; } @@ -624,36 +648,40 @@ void CPUSet::read_dmi_cache_info() //(specialComType=0)如果不是特殊机型直接返回; //(specialComType<=-1)如果是未知类型,则使用之前的判断; //(specialComType>=1)如果是hw机型,略过之前的判断 - qInfo() << "common::specialComType value is:" << specialComType; - if(specialComType == 0){ + qCInfo(app) << "common::specialComType value is:" << specialComType; + if (specialComType == 0) { return; - }else if(specialComType <= -1){ - qInfo() << "use dmidecode check board type!"; - process.start("dmidecode", QStringList() << "-s" << "system-product-name"); + } else if (specialComType <= -1) { + qCInfo(app) << "use dmidecode check board type!"; + process.start("dmidecode", QStringList() << "-s" + << "system-product-name"); process.waitForFinished(-1); QString spnInfo = process.readAllStandardOutput(); if (!spnInfo.contains("KLVV", Qt::CaseInsensitive) && !spnInfo.contains("L540", Qt::CaseInsensitive) && !spnInfo.contains("KLVU", Qt::CaseInsensitive) - && !spnInfo.contains("PGUV", Qt::CaseInsensitive) && !spnInfo.contains("PGUW", Qt::CaseInsensitive) && !spnInfo.contains("W585", Qt::CaseInsensitive)) { + && !spnInfo.contains("PGUV", Qt::CaseInsensitive) && !spnInfo.contains("PGUW", Qt::CaseInsensitive) && !spnInfo.contains("W585", Qt::CaseInsensitive)) { - process.start("bash", QStringList() << "-c" << "dmidecode | grep -i \"String 4\""); + process.start("bash", QStringList() << "-c" + << "dmidecode | grep -i \"String 4\""); process.waitForStarted(); process.waitForFinished(); QString result = process.readAll(); - if(!result.contains("PWC30", Qt::CaseInsensitive)){ //w525 + if (!result.contains("PWC30", Qt::CaseInsensitive) //w525 + && !result.contains("PGUX", Qt::CaseInsensitive)) { process.close(); return; } } } - qInfo() << "Current is special computer type!"; + qCInfo(app) << "Current is special computer type!"; - process.start("dmidecode", QStringList() << "-t" << "cache"); + process.start("dmidecode", QStringList() << "-t" + << "cache"); process.waitForFinished(-1); QString cacheinfo = process.readAllStandardOutput(); QStringList caches = cacheinfo.split("\n\n", QString::SkipEmptyParts); process.close(); - QList > mapInfos; + QList> mapInfos; foreach (const QString &item, caches) { if (item.isEmpty()) continue; @@ -666,13 +694,13 @@ void CPUSet::read_dmi_cache_info() continue; QStringList words = line.split(": "); - if (1 == words.size() && words[0].endsWith(":")) { + if (1 == words.size() && words[0].endsWith(":")) { lasKey = words[0].replace(QRegExp(":$"), ""); mapInfo.insert(lasKey.trimmed(), " "); - } else if (1 == words.size() && !lasKey.isEmpty()) { + } else if (1 == words.size() && !lasKey.isEmpty()) { mapInfo[lasKey.trimmed()] += words[0]; mapInfo[lasKey.trimmed()] += " / "; - } else if (2 == words.size()) { + } else if (2 == words.size()) { lasKey = ""; mapInfo.insert(words[0].trimmed(), words[1].trimmed()); } @@ -719,10 +747,10 @@ void CPUSet::read_dmi_cache_info() // 获取CPU信息 ut001987 void CPUSet::read_lscpu() { - struct lscpu_cxt *cxt; // CPU信息 - cxt = reinterpret_cast< struct lscpu_cxt *>(xcalloc(1, sizeof(struct lscpu_cxt))); // 初始化信息 + struct lscpu_cxt *cxt; // CPU信息 + cxt = reinterpret_cast(xcalloc(1, sizeof(struct lscpu_cxt))); // 初始化信息 if (!cxt) { - qWarning() << __FUNCTION__ << " lscpu_cxt Init Faild!"; + qCWarning(app) << __FUNCTION__ << " lscpu_cxt Init Faild!"; return; } /* set default cpu display mode if none was specified */ @@ -733,14 +761,14 @@ void CPUSet::read_lscpu() cxt->syscpu = ul_new_path(_PATH_SYS_CPU); if (!cxt->syscpu) { - qWarning() << __FUNCTION__ << "failed to initialize CPUs sysfs handler"; + qCWarning(app) << __FUNCTION__ << "failed to initialize CPUs sysfs handler"; return; } if (cxt->prefix) ul_path_set_prefix(cxt->syscpu, cxt->prefix); cxt->procfs = ul_new_path("/proc"); if (!cxt->procfs) { - qWarning() << __FUNCTION__ << "failed to initialize procfs handler!"; + qCWarning(app) << __FUNCTION__ << "failed to initialize procfs handler!"; return; } if (cxt->prefix) @@ -756,9 +784,9 @@ void CPUSet::read_lscpu() lscpu_read_numas(cxt); lscpu_read_topology(cxt); lscpu_decode_arm(cxt); - cxt->virt = lscpu_read_virtualization(cxt); // 获取CPU的虚拟化信息 + cxt->virt = lscpu_read_virtualization(cxt); // 获取CPU的虚拟化信息 struct lscpu_cputype *ct; - ct = lscpu_cputype_get_default(cxt); // 获取CPU类型信息 + ct = lscpu_cputype_get_default(cxt); // 获取CPU类型信息 if (ct) { if (cxt->arch) d->m_info.insert("Architecture", cxt->arch->name); @@ -785,7 +813,7 @@ void CPUSet::read_lscpu() d->m_info.insert("Byte Order", "Big Endian"); #endif d->m_info.insert("CPU(s)", QString::number(cxt->npresents)); - if (cxt->online) { // 当前活动CPU信息 + if (cxt->online) { // 当前活动CPU信息 QString key = cxt->hex ? "On-line CPU(s) mask" : "On-line CPU(s) list"; QString value = ""; size_t setbuflen = static_cast(7 * cxt->maxcpus); @@ -799,7 +827,7 @@ void CPUSet::read_lscpu() } // CPU厂商信息 - if (ct->vendor) { // CPU厂商信息 + if (ct->vendor) { // CPU厂商信息 QString strVendor = ct->vendor; strVendor = strVendor.simplified(); strVendor = strVendor.trimmed(); @@ -810,28 +838,28 @@ void CPUSet::read_lscpu() } else d->m_info.insert("Vendor ID", "-"); - if (ct && ct->bios_vendor) { // BIOS厂商信息 + if (ct && ct->bios_vendor) { // BIOS厂商信息 d->m_info.insert("BIOS Vendor ID", ct->bios_vendor); } - if (ct->modelname) {// CPU型号名称 + if (ct->modelname) { // CPU型号名称 d->m_info.insert("Model name", ct->modelname); } - if (ct->bios_modelname) {// bios 型号名称 + if (ct->bios_modelname) { // bios 型号名称 d->m_info.insert("BIOS Model name", ct->bios_modelname); } - if (ct->bios_family) { // bios系列 + if (ct->bios_family) { // bios系列 d->m_info.insert("BIOS CPU family", ct->bios_family); } - if (ct->machinetype) {// 机器类型 + if (ct->machinetype) { // 机器类型 d->m_info.insert("Machine type", ct->machinetype); } - if (ct->family) { // CPU系列 + if (ct->family) { // CPU系列 d->m_info.insert("CPU family", ct->family); } if (ct->model || ct->revision) { d->m_info.insert("Model", ct->revision ? ct->revision : ct->model); } - d->m_info.insert("Thread(s) per core", QString::number(ct->nthreads_per_core)); // 单核线程数 + d->m_info.insert("Thread(s) per core", QString::number(ct->nthreads_per_core)); // 单核线程数 if (cxt->is_cluster) { d->m_info.insert("Core(s) per cluster", QString::number(ct->ncores_per_socket)); } else { @@ -861,8 +889,7 @@ void CPUSet::read_lscpu() d->m_info.insert("Stepping", ct->stepping); } if (ct->freqboost >= 0) { - d->m_info.insert("Frequency boost", ct->freqboost ? - _("enabled") : _("disabled")); + d->m_info.insert("Frequency boost", ct->freqboost ? _("enabled") : _("disabled")); } if (ct->dynamic_mhz) { @@ -877,7 +904,8 @@ void CPUSet::read_lscpu() d->m_info.insert("CPU max MHz", maxMHz); QString minMHz = QString::number(static_cast(lsblk_cputype_get_minmhz(cxt, ct)), 'f', 4); d->m_info.insert("CPU min MHz", minMHz); - QString nowMHz = QString::number(maxMHz.toDouble() * static_cast(scal / 100), 'f', 4); + // 取首个CPU频率有效值 + QString nowMHz = QString::number(static_cast(first_avaliable_cur_freq(cxt, ct)), 'f', 4); if (scal == 0.0f) { nowMHz = "-"; } @@ -903,7 +931,7 @@ void CPUSet::read_lscpu() d->m_info.insert("Flags", ct->flags); } } else { - qWarning() << __FUNCTION__ << "ct init failed!"; + qCWarning(app) << __FUNCTION__ << "ct init failed!"; return; } @@ -933,11 +961,10 @@ void CPUSet::read_lscpu() if (!sz) continue; if (!cxt->bytes) { - char *tmp = size_to_human_string( // 获取当前cache的值 - SIZE_SUFFIX_3LETTER | - SIZE_SUFFIX_SPACE, - sz); - QString value = QString(tmp);//.replace("MiB","MB"); + char *tmp = size_to_human_string( // 获取当前cache的值 + SIZE_SUFFIX_3LETTER | SIZE_SUFFIX_SPACE, + sz); + QString value = QString(tmp); //.replace("MiB","MB"); if (tmp) { free(tmp); tmp = nullptr; @@ -947,7 +974,6 @@ void CPUSet::read_lscpu() d->m_info.insert(QString(name) + " cache", value); } last = name; - } } read_dmi_cache_info(); @@ -970,9 +996,8 @@ void CPUSet::read_lscpu() continue; if (!cxt->bytes) { char *tmp = size_to_human_string( - SIZE_SUFFIX_3LETTER | - SIZE_SUFFIX_SPACE, - ca->size); + SIZE_SUFFIX_3LETTER | SIZE_SUFFIX_SPACE, + ca->size); d->m_info.insert(ca->name, tmp); if (tmp) { free(tmp); @@ -991,5 +1016,5 @@ qulonglong CPUSet::getUsageTotalDelta() const return d->cpusageTotal[kCurrentStat] - d->cpusageTotal[kLastStat]; } -} // namespace system -} // namespace core +} // namespace system +} // namespace core diff --git a/deepin-system-monitor-main/system/netif_packet_capture.cpp b/deepin-system-monitor-main/system/netif_packet_capture.cpp index d6026aec..ef59de45 100644 --- a/deepin-system-monitor-main/system/netif_packet_capture.cpp +++ b/deepin-system-monitor-main/system/netif_packet_capture.cpp @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later - +#include "ddlog.h" #include "netif_packet_capture.h" #include "netif_packet_parser.h" #include "common/hash.h" @@ -21,31 +21,26 @@ #include #ifndef IFNAMESZ -#define IFNAMESZ 16 +# define IFNAMESZ 16 #endif - //#define PACKET_DISPATCH_IDLE_TIME 200 // pcap dispatch interval -#define PACKET_DISPATCH_IDLE_TIME 50 // pcap dispatch interval -#define PACKET_DISPATCH_BATCH_COUNT 64 // packets to process in a batch -#define PACKET_DISPATCH_QUEUE_LWAT 64 // queue low water mark -#define PACKET_DISPATCH_QUEUE_HWAT 256 // queue high water mark +#define PACKET_DISPATCH_IDLE_TIME 50 // pcap dispatch interval +#define PACKET_DISPATCH_BATCH_COUNT 64 // packets to process in a batch +#define PACKET_DISPATCH_QUEUE_LWAT 64 // queue low water mark +#define PACKET_DISPATCH_QUEUE_HWAT 256 // queue high water mark -#define SOCKSTAT_REFRESH_INTERVAL 2 // socket stat refresh interval (2 seconds) -#define IFADDRS_HASH_CACHE_REFRESH_INTERVAL 10 // socket ifaddrs cache refresh interval (10 seconds) -#define DEVICE_CHANGE_JUDGEMENT_TIME 5000 //判断网卡是否变更时间间隔 +#define SOCKSTAT_REFRESH_INTERVAL 2 // socket stat refresh interval (2 seconds) +#define IFADDRS_HASH_CACHE_REFRESH_INTERVAL 10 // socket ifaddrs cache refresh interval (10 seconds) +#define DEVICE_CHANGE_JUDGEMENT_TIME 5000 //判断网卡是否变更时间间隔 using namespace std; - +using namespace DDLog; namespace core { namespace system { - - - NetifPacketCapture::NetifPacketCapture(NetifMonitor *netIfmontor, QObject *parent) - : QObject(parent) - , m_netifMonitor(netIfmontor) + : QObject(parent), m_netifMonitor(netIfmontor) { m_timer = new QTimer(this); m_timer->setSingleShot(true); @@ -57,7 +52,6 @@ NetifPacketCapture::NetifPacketCapture(NetifMonitor *netIfmontor, QObject *paren m_timerChangeDev->start(DEVICE_CHANGE_JUDGEMENT_TIME); } - void NetifPacketCapture::whetherDevChanged() { if (m_devName.isEmpty()) { @@ -81,12 +75,14 @@ bool NetifPacketCapture::hasDevIP() } struct sockaddr_in *addr {}; - struct ifreq ifr {}; + struct ifreq ifr + { + }; char *address {}; int sockfd; //设备名称过长 if (m_devName.size() >= IFNAMSIZ) { - //qDebug()<<"Device name too long! Invalid device Name!"; + //qCDebug(app)<<"Device name too long! Invalid device Name!"; return false; } @@ -97,11 +93,11 @@ bool NetifPacketCapture::hasDevIP() //获取网络IP(IPv4) if (ioctl(sockfd, SIOCGIFADDR, &ifr) == -1) { close(sockfd); - //qDebug()<<"ioctl error!"; + //qCDebug(app)<<"ioctl error!"; return false; } - addr = (struct sockaddr_in *) & (ifr.ifr_addr); + addr = (struct sockaddr_in *)&(ifr.ifr_addr); address = inet_ntoa(addr->sin_addr); if (address) { close(sockfd); @@ -111,8 +107,6 @@ bool NetifPacketCapture::hasDevIP() close(sockfd); return false; } - - } bool NetifPacketCapture::getCurrentDevName() @@ -133,7 +127,7 @@ bool NetifPacketCapture::getCurrentDevName() // 设备和优先级列编号 int metricColNum = 0; int devColNum = 0; - QList > metricList = {}; + QList> metricList = {}; QString devName = ""; if (totalList.size() > 0) { QStringList firstLine = totalList[0]; @@ -184,7 +178,6 @@ bool NetifPacketCapture::getCurrentDevName() return false; } return true; - } // void NetifPacketCapture::startNetifMonitorJob() @@ -200,7 +193,7 @@ void NetifPacketCapture::startNetifMonitorJob() // create pcap handler m_handle = pcap_create(m_devName.toLocal8Bit().data(), errbuf); if (!m_handle) { - qDebug() << "pcap_create failed: " << errbuf; + qCDebug(app) << "pcap_create failed: " << errbuf; return; } @@ -211,13 +204,13 @@ void NetifPacketCapture::startNetifMonitorJob() rc = pcap_compile(m_handle, &pgm, pattern, 1, PCAP_NETMASK_UNKNOWN); if (rc == -1) { - qDebug() << "pcap_compile failed: " << pcap_geterr(m_handle); + qCDebug(app) << "pcap_compile failed: " << pcap_geterr(m_handle); pcap_close(m_handle); return; } rc = pcap_setfilter(m_handle, &pgm); if (rc == -1) { - qDebug() << "pcap_setfilter failed: " << pcap_geterr(m_handle); + qCDebug(app) << "pcap_setfilter failed: " << pcap_geterr(m_handle); pcap_close(m_handle); return; } @@ -226,9 +219,9 @@ void NetifPacketCapture::startNetifMonitorJob() // activate pcap handler rc = pcap_activate(m_handle); if (rc > 0) { - qDebug() << "pcap_activate warning: " << pcap_statustostr(rc); + qCDebug(app) << "pcap_activate warning: " << pcap_statustostr(rc); } else if (rc < 0) { - qDebug() << "pcap_setnonblock failed: " << pcap_statustostr(rc); + qCDebug(app) << "pcap_setnonblock failed: " << pcap_statustostr(rc); pcap_close(m_handle); return; } @@ -432,7 +425,7 @@ void NetifPacketCapture::dispatchPackets() return; } else if (nr == -1) { // error occurred while processing packets - qDebug() << "pcap_dispatch failed: " << pcap_geterr(m_handle); + qCDebug(app) << "pcap_dispatch failed: " << pcap_geterr(m_handle); m_timer->stop(); break; } else if (nr == -2) { @@ -452,7 +445,7 @@ bool readNetIfAddrs(NetIFAddrsMap &addrsMap) errno = 0; if (getifaddrs(&addr_hdr) == -1) { - qWarning() << QString("getifaddrs failed: [%1] %2").arg(errno).arg(strerror(errno)); + qCWarning(app) << QString("getifaddrs failed: [%1] %2").arg(errno).arg(strerror(errno)); return false; } @@ -519,7 +512,5 @@ void NetifPacketCapture::refreshIfAddrsHashCache() } } - - -} // namespace system -} // namespace core +} // namespace system +} // namespace core diff --git a/deepin-system-monitor-main/system/netlink.cpp b/deepin-system-monitor-main/system/netlink.cpp index cad125c0..d06fba83 100644 --- a/deepin-system-monitor-main/system/netlink.cpp +++ b/deepin-system-monitor-main/system/netlink.cpp @@ -4,7 +4,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "netlink.h" - +#include "ddlog.h" #include "nl_addr.h" #include "nl_link.h" @@ -14,7 +14,7 @@ #include #include #include - +using namespace DDLog; namespace core { namespace system { @@ -23,25 +23,25 @@ Netlink::Netlink() int rc = 0; m_sock = nl_socket_alloc(); if (!m_sock) { - qWarning() << "Error: nl_socket_alloc failed"; + qCWarning(app) << "Error: nl_socket_alloc failed"; return; } rc = nl_connect(m_sock, NETLINK_ROUTE); if (rc) { - qWarning() << "Error: nl_connect failed"; + qCWarning(app) << "Error: nl_connect failed"; return; } rc = rtnl_link_alloc_cache(m_sock, AF_UNSPEC, &m_linkCache); if (rc) { - qWarning() << "Error: rtnl_link_alloc_cache failed"; + qCWarning(app) << "Error: rtnl_link_alloc_cache failed"; return; } rc = rtnl_addr_alloc_cache(m_sock, &m_addrCache); if (rc) { - qWarning() << "Error: rtnl_addr_alloc_cache failed"; + qCWarning(app) << "Error: rtnl_addr_alloc_cache failed"; } } @@ -64,5 +64,5 @@ AddrIterator Netlink::addrIterator() return it; } -} // namespace system -} // namespace core +} // namespace system +} // namespace core diff --git a/deepin-system-monitor-main/system/nl_hwaddr.cpp b/deepin-system-monitor-main/system/nl_hwaddr.cpp index 46829545..66f77703 100644 --- a/deepin-system-monitor-main/system/nl_hwaddr.cpp +++ b/deepin-system-monitor-main/system/nl_hwaddr.cpp @@ -121,7 +121,9 @@ void NLHWAddr::initData() { struct ifreq ifr; memset(&ifr, 0, sizeof(ifr)); - strcpy(ifr.ifr_name, m_ifname); + //设备名称长度检查 + if (m_ifname.size() < IFNAMSIZ) + strcpy(ifr.ifr_name, m_ifname); int fd = socket(PF_INET, SOCK_DGRAM, 0); if (ioctl(fd, SIOCGIFHWADDR, &ifr) == 0) { string hwaddr = getmac(reinterpret_cast(ifr.ifr_hwaddr.sa_data), ifr.ifr_hwaddr.sa_family); diff --git a/deepin-system-monitor-main/system/sys_info.cpp b/deepin-system-monitor-main/system/sys_info.cpp index f4c19a69..b8ce4117 100644 --- a/deepin-system-monitor-main/system/sys_info.cpp +++ b/deepin-system-monitor-main/system/sys_info.cpp @@ -385,15 +385,26 @@ void SysInfo::read_btime(struct timeval &btime) void SysInfo::read_loadavg(LoadAvg &loadAvg) { - struct sysinfo info { - }; - int rc = sysinfo(&info); - if (!rc) { - loadAvg->lavg_1m = info.loads[0]; - loadAvg->lavg_5m = info.loads[1]; - loadAvg->lavg_15m = info.loads[2]; - - return; + QFile file("/proc/loadavg"); + if (file.exists() && file.open(QFile::ReadOnly)) { + // 只需要读取第一行数据 + QByteArray lineData = file.readLine(); + file.close(); + /*样例数据: + $ cat /proc/loadavg + 0.41 0.46 0.36 2/2646 20183 + */ + + // 分割数据 取前3 + QStringList cpuStatus = QString(lineData).split(" ", QString::SkipEmptyParts); + + if (cpuStatus.size() > 3) { + loadAvg->lavg_1m = cpuStatus[0].toFloat(); + loadAvg->lavg_5m = cpuStatus[1].toFloat(); + loadAvg->lavg_15m = cpuStatus[2].toFloat(); + + return ; + } } print_errno(errno, QString("call sysinfo failed")); diff --git a/deepin-system-monitor-main/system/sys_info.h b/deepin-system-monitor-main/system/sys_info.h index 7d59d51b..136ecca6 100644 --- a/deepin-system-monitor-main/system/sys_info.h +++ b/deepin-system-monitor-main/system/sys_info.h @@ -32,9 +32,9 @@ namespace core { namespace system { struct load_avg_t { - ulong lavg_1m {0}; - ulong lavg_5m {0}; - ulong lavg_15m {0}; + float lavg_1m {0}; + float lavg_5m {0}; + float lavg_15m {0}; }; using LoadAvg = std::shared_ptr; @@ -222,9 +222,9 @@ inline void SysInfo::set_btime(timeval &btime) inline QString &operator<<(QString &buffer, const load_avg_t &rhs) { return buffer.append(QString("%1 %2 %3") - .arg(rhs.lavg_1m / 100, 0, 'f', 2, QLatin1Char(' ')) - .arg(rhs.lavg_5m / 100, 0, 'f', 2, QLatin1Char(' ')) - .arg(rhs.lavg_15m / 100, 0, 'f', 2, QLatin1Char(' '))); + .arg(rhs.lavg_1m , 0, 'f', 2, QLatin1Char(' ')) + .arg(rhs.lavg_5m , 0, 'f', 2, QLatin1Char(' ')) + .arg(rhs.lavg_15m , 0, 'f', 2, QLatin1Char(' '))); } } // namespace system diff --git a/deepin-system-monitor-main/system/system_monitor.cpp b/deepin-system-monitor-main/system/system_monitor.cpp index 1f0203fb..d2bc23da 100644 --- a/deepin-system-monitor-main/system/system_monitor.cpp +++ b/deepin-system-monitor-main/system/system_monitor.cpp @@ -25,7 +25,6 @@ SystemMonitor::SystemMonitor(QObject *parent) , m_processDB(new ProcessDB(this)) { m_sysInfo->readSysInfoStatic(); - } SystemMonitor::~SystemMonitor() @@ -85,6 +84,7 @@ void SystemMonitor::timerEvent(QTimerEvent *event) m_processDB->update(); } else { emit statInfoUpdated(); + recountAppAndProcess(); } if(cnt++ >250) cnt = 0; @@ -98,6 +98,25 @@ void SystemMonitor::updateSystemMonitorInfo() m_processDB->update(); emit statInfoUpdated(); + recountAppAndProcess(); +} + +/** + @brief Count current apps and processes on SystemMonitor child thread. + */ +void SystemMonitor::recountAppAndProcess() +{ + ProcessSet *processSet = m_processDB->processSet(); + // count all app + const QList &newpidlst = processSet->getPIDList(); + int appCount = 0; + for (const auto &pid : newpidlst) { + auto process = processSet->getProcessById(pid); + if (process.appType() == kFilterApps) + appCount++; + } + + emit appAndProcCountUpdate(appCount, newpidlst.size()); } } // namespace system diff --git a/deepin-system-monitor-main/system/system_monitor.h b/deepin-system-monitor-main/system/system_monitor.h index ff5121d0..c44b4e38 100644 --- a/deepin-system-monitor-main/system/system_monitor.h +++ b/deepin-system-monitor-main/system/system_monitor.h @@ -30,6 +30,7 @@ class SystemMonitor : public QObject signals: void statInfoUpdated(); + void appAndProcCountUpdate(int appCount, int procCount); public: explicit SystemMonitor(QObject *parent = nullptr); @@ -48,6 +49,7 @@ class SystemMonitor : public QObject private: void updateSystemMonitorInfo(); + void recountAppAndProcess(); private: SysInfo *m_sysInfo; diff --git a/deepin-system-monitor-main/translations/deepin-system-monitor_pl.ts b/deepin-system-monitor-main/translations/deepin-system-monitor_pl.ts index 33a05262..d35347f2 100644 --- a/deepin-system-monitor-main/translations/deepin-system-monitor_pl.ts +++ b/deepin-system-monitor-main/translations/deepin-system-monitor_pl.ts @@ -16,14 +16,6 @@ Hide details Ukryj szczegóły - - Overall utilization - - - - Individual utilization - - BlockDevItemWidget @@ -372,7 +364,7 @@ Mapped - Mapowane + Mapowane Total swap @@ -419,7 +411,7 @@ Reads merged/s - Odczytów połączonych/s + Odczytów scalonych/s Sectors written @@ -431,7 +423,7 @@ Writes merged - Zapisów połączonych + Zapisów scalonych Writes/s @@ -443,7 +435,7 @@ Writes merged/s - Zapisów połączonych/s + Zapisów scalonych/s @@ -502,14 +494,7 @@ Czy na pewno chcesz kontynuować? End button - Koniec - - - - MainWindow - - Settings - Ustawienia + Zakończ @@ -574,7 +559,7 @@ Czy na pewno chcesz kontynuować? RX packets - Paczki RX + Pakiety RX RX bytes @@ -590,7 +575,7 @@ Czy na pewno chcesz kontynuować? RX overruns - Nadpisane RX + Przekroczenia RX RX frame @@ -598,7 +583,7 @@ Czy na pewno chcesz kontynuować? TX packets - Paczki TX + Pakiety TX TX bytes @@ -610,7 +595,7 @@ Czy na pewno chcesz kontynuować? TX overruns - Nadpisane TX + Przekroczenia TX TX carrier @@ -936,34 +921,6 @@ Czy na pewno chcesz kontynuować? Not support Brak wsparcia - - Settings - Ustawienia - - - System Protection - Ochrona systemu - - - Show warnings when the usage exceeds the thresholds - Wyświetlaj ostrzeżenia, gdy użycie przekracza progi - - - Notifications - Powiadomienia - - - CPU warning threshold (%) - - - - Memory warning threshold (%) - - - - Warning interval (min) - - Service.Action.Set.Startup.Mode @@ -1059,21 +1016,6 @@ Czy na pewno chcesz kontynuować? Typ uruchomienia - - SystemProtectionSetting - - Settings - Ustawienia - - - (Modifiable) - (Modyfikowalny) - - - Range: %1-%2 - Zakres: %1-%2 - - Title.Bar.Context.Menu @@ -1133,4 +1075,4 @@ Czy na pewno chcesz kontynuować? Edytuj informacje konta - + \ No newline at end of file diff --git a/deepin-system-monitor-main/translations/policy/policy_pl.ts b/deepin-system-monitor-main/translations/policy/policy_pl.ts index 4ad64b36..88b2f9ba 100644 --- a/deepin-system-monitor-main/translations/policy/policy_pl.ts +++ b/deepin-system-monitor-main/translations/policy/policy_pl.ts @@ -4,27 +4,27 @@ Authentication is required to change process priority - Uwierzytelnienie jest wymagane, aby zmienić priorytet procesu + Wymagane jest uwierzytelnienie, aby zmienić priorytet procesu Renice process - Proces renice + Zmień priorytet procesu Authentication is required to control other users' processes - Uwierzytelnianie jest wymagane do kontrolowania procesów innych użytkowników + Wymagane jest uwierzytelnienie do kontrolowania procesów innych użytkowników Kill process - Zamknij proces + Zabij Authentication is required to set service startup type - Uwierzytelnianie jest wymagane, aby ustawić typ uruchamiania usługi + Wymagane jest uwierzytelnienie, aby ustawić typ uruchamiania usługi diff --git a/deepin-system-monitor-main/wm/wm_connection.cpp b/deepin-system-monitor-main/wm/wm_connection.cpp index 2802f0bb..93892445 100644 --- a/deepin-system-monitor-main/wm/wm_connection.cpp +++ b/deepin-system-monitor-main/wm/wm_connection.cpp @@ -4,8 +4,9 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "wm_connection.h" - +#include "ddlog.h" #include +using namespace DDLog; namespace core { namespace wm { @@ -15,7 +16,7 @@ WMConnection::WMConnection(const QByteArray &display) m_conn = XConnection(xcb_connect(display.isEmpty() ? nullptr : display.constData(), &m_screenNumber)); auto *conn = m_conn.get(); if (conn && xcb_connection_has_error(conn)) { - qDebug() << "Unable to connect to X server"; + qCDebug(app) << "Unable to connect to X server"; return; } m_atoms.initialize(conn); @@ -24,7 +25,7 @@ WMConnection::WMConnection(const QByteArray &display) auto iter = xcb_setup_roots_iterator(m_setup); auto screenCount = xcb_setup_roots_length(m_setup); if (screenCount < m_screenNumber) { - qDebug() << QString("Unable to access to screen %1, max is %2").arg(m_screenNumber).arg(screenCount - 1); + qCDebug(app) << QString("Unable to access to screen %1, max is %2").arg(m_screenNumber).arg(screenCount - 1); return; } @@ -40,5 +41,5 @@ WMConnection::~WMConnection() { } -} // namespace wm -} // namespace core +} // namespace wm +} // namespace core diff --git a/deepin-system-monitor-main/wm/wm_info.cpp b/deepin-system-monitor-main/wm/wm_info.cpp index 8e2715d6..343eb948 100644 --- a/deepin-system-monitor-main/wm/wm_info.cpp +++ b/deepin-system-monitor-main/wm/wm_info.cpp @@ -4,17 +4,18 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "wm_info.h" - +#include "ddlog.h" #include #include using namespace core::wm; using namespace std; +using namespace DDLog; enum wm_window_type_t { - kUnknownWindowType = -1, - kNormalWindowType = 0, + kUnknownWindowType = -1, + kNormalWindowType = 0, kDesktopWindowType, kDockWindowType, kToolbarWindowType, @@ -31,8 +32,8 @@ enum wm_window_type_t { }; enum wm_state_t { - kUnknownState = -1, - kModalState = 0, + kUnknownState = -1, + kModalState = 0, kStickyState, kMaximizedVertState, kMaximizedHorzState, @@ -48,77 +49,85 @@ enum wm_state_t { }; enum wm_window_class_t { - kUnknownClass = -1, - kInputOutputClass = XCB_WINDOW_CLASS_INPUT_OUTPUT, - kInputOnlyClass = XCB_WINDOW_CLASS_INPUT_ONLY + kUnknownClass = -1, + kInputOutputClass = XCB_WINDOW_CLASS_INPUT_OUTPUT, + kInputOnlyClass = XCB_WINDOW_CLASS_INPUT_ONLY }; enum wm_window_map_state_t { - kUnknownMapState = -1, - kUnMappedState = XCB_MAP_STATE_UNMAPPED, - kUnViewableState = XCB_MAP_STATE_UNVIEWABLE, - kViewableState = XCB_MAP_STATE_VIEWABLE + kUnknownMapState = -1, + kUnMappedState = XCB_MAP_STATE_UNMAPPED, + kUnViewableState = XCB_MAP_STATE_UNVIEWABLE, + kViewableState = XCB_MAP_STATE_VIEWABLE }; -struct core::wm::wm_request_t { - xcb_get_property_cookie_t netNameCookie; - xcb_get_property_cookie_t nameCookie; - xcb_get_geometry_cookie_t geomCookie; - xcb_translate_coordinates_cookie_t transCoordsCookie; - xcb_get_window_attributes_cookie_t attrCookie; - xcb_get_property_cookie_t desktopCookie; - xcb_get_property_cookie_t windowTypeCookie; - xcb_get_property_cookie_t stateCookie; - xcb_get_property_cookie_t pidCookie; - xcb_get_property_cookie_t frameExtentsCookie; - xcb_query_tree_cookie_t treeCookie; +struct core::wm::wm_request_t +{ + xcb_get_property_cookie_t netNameCookie; + xcb_get_property_cookie_t nameCookie; + xcb_get_geometry_cookie_t geomCookie; + xcb_translate_coordinates_cookie_t transCoordsCookie; + xcb_get_window_attributes_cookie_t attrCookie; + xcb_get_property_cookie_t desktopCookie; + xcb_get_property_cookie_t windowTypeCookie; + xcb_get_property_cookie_t stateCookie; + xcb_get_property_cookie_t pidCookie; + xcb_get_property_cookie_t frameExtentsCookie; + xcb_query_tree_cookie_t treeCookie; }; -struct core::wm::wm_frame_extents_t { +struct core::wm::wm_frame_extents_t +{ uint left; uint right; uint top; uint bottom; }; -struct core::wm::wm_window_ext_t { - WMWId windowId; // window id - WMWId parent {}; // window tree schema - QList children {}; - - pid_t pid; // _NET_WM_PID - int desktop {}; // desktop - enum wm_window_class_t wclass {}; // class: InputOutput || InputOnly && win attrs: XCB_WINDOW_CLASS_INPUT_OUTPUT || XCB_WINDOW_CLASS_INPUT_ONLY - enum wm_window_map_state_t map_state {}; // map state: unmapped || unviewable || viewable && win attrs: XCB_MAP_STATE_UNMAPPED || XCB_MAP_STATE_UNVIEWABLE || XCB_MAP_STATE_VIEWABLE - QList states {}; // window states && // _NET_WM_STATE - QList types {}; // window types (in order of preference) && _NET_WM_WINDOW_TYPE - struct wm_frame_extents_t extents {}; // window extents && //_NET_FRAME_EXTENTS - QRect rect {}; // geometry - - std::unique_ptr request; +struct core::wm::wm_window_ext_t +{ + WMWId windowId; // window id + WMWId parent {}; // window tree schema + QList children {}; + + pid_t pid; // _NET_WM_PID + int desktop {}; // desktop + enum wm_window_class_t wclass {}; // class: InputOutput || InputOnly && win attrs: XCB_WINDOW_CLASS_INPUT_OUTPUT || XCB_WINDOW_CLASS_INPUT_ONLY + enum wm_window_map_state_t map_state {}; // map state: unmapped || unviewable || viewable && win attrs: XCB_MAP_STATE_UNMAPPED || XCB_MAP_STATE_UNVIEWABLE || XCB_MAP_STATE_VIEWABLE + QList states {}; // window states && // _NET_WM_STATE + QList types {}; // window types (in order of preference) && _NET_WM_WINDOW_TYPE + struct wm_frame_extents_t extents + { + }; // window extents && //_NET_FRAME_EXTENTS + QRect rect {}; // geometry + + std::unique_ptr request; }; // tree schema in bottom to top stacking order -struct core::wm::wm_tree_t { - struct wm_window_ext_t *root; // root window - std::map cache; // [windowId : window extended info] mapping +struct core::wm::wm_tree_t +{ + struct wm_window_ext_t *root; // root window + std::map cache; // [windowId : window extended info] mapping }; -struct XReplyDeleter { +struct XReplyDeleter +{ void operator()(void *p) { free(p); } }; -using XGetPropertyReply = std::unique_ptr; -using XGetGeometryReply = std::unique_ptr; -using XGetWindowAttributeReply = std::unique_ptr; -using XQueryTreeReply = std::unique_ptr; -using XTransCoordsReply = std::unique_ptr; -using XGetAtomNameReply = std::unique_ptr; -using XInternAtomReply = std::unique_ptr; - -struct XDisconnector { +using XGetPropertyReply = std::unique_ptr; +using XGetGeometryReply = std::unique_ptr; +using XGetWindowAttributeReply = std::unique_ptr; +using XQueryTreeReply = std::unique_ptr; +using XTransCoordsReply = std::unique_ptr; +using XGetAtomNameReply = std::unique_ptr; +using XInternAtomReply = std::unique_ptr; + +struct XDisconnector +{ void operator()(xcb_connection_t *c) { xcb_disconnect(c); @@ -143,7 +152,6 @@ std::list WMInfo::selectWindow(const QPoint &pos) const std::function scan_tree; scan_tree = [&](const struct wm_window_ext_t *parent) { - for (auto &childWindowId : parent->children) { auto &child = m_tree->cache[childWindowId]; @@ -164,7 +172,7 @@ std::list WMInfo::selectWindow(const QPoint &pos) const // window type if (child->types.startsWith(kDockWindowType) - || child->types.startsWith(kDesktopWindowType)) + || child->types.startsWith(kDesktopWindowType)) continue; // window state @@ -174,24 +182,23 @@ std::list WMInfo::selectWindow(const QPoint &pos) const WMWindowArea warea(new struct wm_window_area_t()); // rect & extents - QRect rect{child->rect}; - rect = rect.marginsAdded({int(child->extents.left), - int(child->extents.top), - int(child->extents.right), - int(child->extents.bottom)}); + QRect rect { child->rect }; + rect = rect.marginsAdded({ int(child->extents.left), + int(child->extents.top), + int(child->extents.right), + int(child->extents.bottom) }); if (!rect.contains(pos)) continue; // window adjusted rect (including bounding frame) warea->rect = rect; - // pid - warea->pid = child->pid; + // pid + warea->pid = child->pid; warea->wid = child->windowId; walist.push_back(std::move(warea)); - } }; @@ -222,10 +229,10 @@ bool WMInfo::isCursorHoveringDocks(const QPoint &pos) const std::list WMInfo::getHoveredByWindowList(WMWId wid, QRect &area) const { std::list list {}; - bool done {false}; + bool done { false }; std::function scan_tree; - scan_tree = [&](const struct wm_window_ext_t *parent, const QRect & area) { + scan_tree = [&](const struct wm_window_ext_t *parent, const QRect &area) { for (auto &childWindowId : parent->children) { if (childWindowId == wid) { done = true; @@ -262,11 +269,11 @@ std::list WMInfo::getHoveredByWindowList(WMWId wid, QRect &area) c // adjust child rect with frame extents auto adjusted = child->rect; - adjusted = adjusted.marginsAdded(QMargins{ - int(child->extents.left), - int(child->extents.top), - int(child->extents.right), - int(child->extents.bottom)}); + adjusted = adjusted.marginsAdded(QMargins { + int(child->extents.left), + int(child->extents.top), + int(child->extents.right), + int(child->extents.bottom) }); // translate child geom if (!adjusted.intersects(area)) @@ -296,7 +303,7 @@ void WMInfo::buildWindowTreeSchema() auto *conn = connection.get(); err = xcb_connection_has_error(conn); if (err) { - qDebug() << "Unable to connect to X server"; + qCDebug(app) << "Unable to connect to X server"; return; } @@ -307,7 +314,7 @@ void WMInfo::buildWindowTreeSchema() xcb_screen_iterator_t iter = xcb_setup_roots_iterator(setup); int screenCount = xcb_setup_roots_length(setup); if (screenCount < screenNumber) { - qDebug() << QString("Unable to access to screen %1, max is %2").arg(screenNumber).arg(screenCount - 1); + qCDebug(app) << QString("Unable to access to screen %1, max is %2").arg(screenNumber).arg(screenCount - 1); return; } // get the screen we want from a list of screens in linked list structure @@ -430,35 +437,35 @@ void WMInfo::initAtomCache(xcb_connection_t *conn) buffer = frameExtentsAtomMeta->name; auto frameExtentsAtomCookie = xcb_intern_atom(conn, false, uint16_t(buffer.length()), buffer.data()); - auto nameAtom = getAtom(conn, nameAtomCookie); - nameAtomMeta->atom = nameAtom; - auto utf8StringAtom = getAtom(conn, utf8StringAtomCookie); - utf8StringAtomMeta->atom = utf8StringAtom; - auto desktopAtom = getAtom(conn, desktopAtomCookie); - desktopAtomMeta->atom = desktopAtom; - auto windowTypeAtom = getAtom(conn, windowTypeAtomCookie); - windowTypeAtomMeta->atom = windowTypeAtom; - auto stateAtom = getAtom(conn, stateAtomCookie); - stateAtomMeta->atom = stateAtom; - auto pidAtom = getAtom(conn, pidAtomCookie); - pidAtomMeta->atom = pidAtom; - auto frameExtentsAtom = getAtom(conn, frameExtentsAtomCookie); - frameExtentsAtomMeta->atom = frameExtentsAtom; - - m_internAtomCache[kNetNameAtom] = nameAtom; - m_internAtomCache[kUTF8StringAtom] = utf8StringAtom; - m_internAtomCache[kNetDesktopAtom] = desktopAtom; - m_internAtomCache[kNetWindowTypeAtom] = windowTypeAtom; - m_internAtomCache[kNetStateAtom] = stateAtom; - m_internAtomCache[kNetPIDAtom] = pidAtom; + auto nameAtom = getAtom(conn, nameAtomCookie); + nameAtomMeta->atom = nameAtom; + auto utf8StringAtom = getAtom(conn, utf8StringAtomCookie); + utf8StringAtomMeta->atom = utf8StringAtom; + auto desktopAtom = getAtom(conn, desktopAtomCookie); + desktopAtomMeta->atom = desktopAtom; + auto windowTypeAtom = getAtom(conn, windowTypeAtomCookie); + windowTypeAtomMeta->atom = windowTypeAtom; + auto stateAtom = getAtom(conn, stateAtomCookie); + stateAtomMeta->atom = stateAtom; + auto pidAtom = getAtom(conn, pidAtomCookie); + pidAtomMeta->atom = pidAtom; + auto frameExtentsAtom = getAtom(conn, frameExtentsAtomCookie); + frameExtentsAtomMeta->atom = frameExtentsAtom; + + m_internAtomCache[kNetNameAtom] = nameAtom; + m_internAtomCache[kUTF8StringAtom] = utf8StringAtom; + m_internAtomCache[kNetDesktopAtom] = desktopAtom; + m_internAtomCache[kNetWindowTypeAtom] = windowTypeAtom; + m_internAtomCache[kNetStateAtom] = stateAtom; + m_internAtomCache[kNetPIDAtom] = pidAtom; m_internAtomCache[kNetFrameExtentsAtom] = frameExtentsAtom; - m_atomCache[nameAtom] = std::move(nameAtomMeta); - m_atomCache[utf8StringAtom] = std::move(utf8StringAtomMeta); - m_atomCache[desktopAtom] = std::move(desktopAtomMeta); - m_atomCache[windowTypeAtom] = std::move(windowTypeAtomMeta); - m_atomCache[stateAtom] = std::move(stateAtomMeta); - m_atomCache[pidAtom] = std::move(pidAtomMeta); + m_atomCache[nameAtom] = std::move(nameAtomMeta); + m_atomCache[utf8StringAtom] = std::move(utf8StringAtomMeta); + m_atomCache[desktopAtom] = std::move(desktopAtomMeta); + m_atomCache[windowTypeAtom] = std::move(windowTypeAtomMeta); + m_atomCache[stateAtom] = std::move(stateAtomMeta); + m_atomCache[pidAtom] = std::move(pidAtomMeta); m_atomCache[frameExtentsAtom] = std::move(frameExtentsAtomMeta); } @@ -483,7 +490,7 @@ QByteArray WMInfo::getAtomName(xcb_connection_t *conn, xcb_atom_t atom) if (reply) { auto len = xcb_get_atom_name_name_length(reply.get()); auto name = xcb_get_atom_name_name(reply.get()); - meta->name = QByteArray{name, len}; + meta->name = QByteArray { name, len }; } m_atomCache[atom] = std::move(meta); } @@ -493,7 +500,7 @@ QByteArray WMInfo::getAtomName(xcb_connection_t *conn, xcb_atom_t atom) WMWindowExt WMInfo::requestWindowExtInfo(xcb_connection_t *conn, xcb_window_t window) { - WMWindowExt winfo(new wm_window_ext_t{}); + WMWindowExt winfo(new wm_window_ext_t {}); std::unique_ptr req(new wm_request_t {}); winfo->request = std::move(req); @@ -690,8 +697,8 @@ WMWindowExt WMInfo::requestWindowExtInfo(xcb_connection_t *conn, xcb_window_t wi winfo->types << kDNDWindowType; } else { winfo->types << kUnknownWindowType; - } // !if - } // !for + } // !if + } // !for } // state XGetPropertyReply stateReply(xcb_get_property_reply(conn, stateCookie, nullptr)); @@ -726,8 +733,8 @@ WMWindowExt WMInfo::requestWindowExtInfo(xcb_connection_t *conn, xcb_window_t wi winfo->states << kDemandsAttentionState; } else { winfo->states << kUnknownState; - } // !if - } // !for + } // !if + } // !for } // PID XGetPropertyReply pidReply(xcb_get_property_reply(conn, pidCookie, nullptr)); @@ -741,9 +748,9 @@ WMWindowExt WMInfo::requestWindowExtInfo(xcb_connection_t *conn, xcb_window_t wi XGetPropertyReply frameExtentsReply(xcb_get_property_reply(conn, frameExtentsCookie, nullptr)); if (frameExtentsReply && frameExtentsReply->type == XCB_ATOM_CARDINAL && frameExtentsReply->value_len == 4) { auto *frameExtents = reinterpret_cast(xcb_get_property_value(frameExtentsReply.get())); - winfo->extents.left = frameExtents[0]; - winfo->extents.right = frameExtents[1]; - winfo->extents.top = frameExtents[2]; + winfo->extents.left = frameExtents[0]; + winfo->extents.right = frameExtents[1]; + winfo->extents.top = frameExtents[2]; winfo->extents.bottom = frameExtents[3]; } else { winfo->extents = {}; diff --git a/deepin-system-monitor-main/wm/wm_window_list.cpp b/deepin-system-monitor-main/wm/wm_window_list.cpp index 2a36bef3..9e9a3c92 100644 --- a/deepin-system-monitor-main/wm/wm_window_list.cpp +++ b/deepin-system-monitor-main/wm/wm_window_list.cpp @@ -10,6 +10,7 @@ #include "system/system_monitor_thread.h" #include "process/process_db.h" #include "common/common.h" +#include "helper.hpp" #include @@ -92,67 +93,67 @@ void WMWindowList::addDesktopEntryApp(Process *proc) int WMWindowList::getAppCount() { - //Judge whether the current user is root - Process proc(static_cast(qApp->applicationPid())); - //read Process Info - proc.readProcessInfo(); - bool isRootUser = false; - //Compare with Root UID 0 - if (0 == proc.userName().compare("root", Qt::CaseInsensitive)) { - isRootUser = true; - } else { - isRootUser = false; - } - int trayAppNum = 0; - unsigned long traySize = m_trayAppcache.size(); - std::map::iterator itTray; - //if uid = 0,read tray apps number - for(itTray=m_trayAppcache.begin();itTray!=m_trayAppcache.end();++itTray) { - Process proc(itTray->first); - proc.readProcessInfo(); - uid_t procUid = proc.uid(); - if (procUid == 0) { - trayAppNum++; - } - // 判断托盘应用缓存大小 如果不想等则退出当前循环 - if (traySize != m_trayAppcache.size()) - break; - } - int guiAppNum = 0; - std::map::iterator itGui; - unsigned long guiSize = m_guiAppcache.size(); - //if uid = 0,read gui apps number - for(itGui=m_guiAppcache.begin();itGui!=m_guiAppcache.end();++itGui) { - Process proc(itGui->first); - proc.readProcessInfo(); - uid_t procUid = proc.uid(); - if (procUid == 0) { - guiAppNum++; - } - // 判断gui应用缓存大小 如果不想等则退出当前循环 - if (guiSize != m_guiAppcache.size()) - break; - } - //if uid = 0, read desktop apps number - int desktopAppNum = 0; - int desktopSize = m_desktopEntryCache.size(); - for (int i = 0; i < m_desktopEntryCache.size(); i++) { - Process proc(m_desktopEntryCache.at(i)); - proc.readProcessInfo(); - uid_t procUid = proc.uid(); - if (procUid == 0) { - desktopAppNum++; - } - // 判断桌面应用缓存大小 如果不想等则退出当前循环 - if (desktopSize != m_desktopEntryCache.size()) - break; - } - //if user is root,add all numbers of app, otherwise, minuse root user's apps - if (isRootUser) { - return trayAppNum + guiAppNum + desktopAppNum; - } else { - return static_cast(m_trayAppcache.size() + m_guiAppcache.size()) + m_desktopEntryCache.size() - trayAppNum - guiAppNum - desktopAppNum; - } + //Judge whether the current user is root + Process proc(static_cast(qApp->applicationPid())); + //read Process Info + proc.readProcessInfo(); + bool isRootUser = false; + //Compare with Root UID 0 + if (0 == proc.userName().compare("root", Qt::CaseInsensitive)) { + isRootUser = true; + } else { + isRootUser = false; + } + int trayAppNum = 0; + unsigned long traySize = m_trayAppcache.size(); + std::map::iterator itTray; + //if uid = 0,read tray apps number + for (itTray = m_trayAppcache.begin(); itTray != m_trayAppcache.end(); ++itTray) { + Process proc(itTray->first); + proc.readProcessInfo(); + uid_t procUid = proc.uid(); + if (procUid == 0) { + trayAppNum++; + } + // 判断托盘应用缓存大小 如果不想等则退出当前循环 + if (traySize != m_trayAppcache.size()) + break; + } + int guiAppNum = 0; + std::map::iterator itGui; + unsigned long guiSize = m_guiAppcache.size(); + //if uid = 0,read gui apps number + for (itGui = m_guiAppcache.begin(); itGui != m_guiAppcache.end(); ++itGui) { + Process proc(itGui->first); + proc.readProcessInfo(); + uid_t procUid = proc.uid(); + if (procUid == 0) { + guiAppNum++; + } + // 判断gui应用缓存大小 如果不想等则退出当前循环 + if (guiSize != m_guiAppcache.size()) + break; + } + //if uid = 0, read desktop apps number + int desktopAppNum = 0; + int desktopSize = m_desktopEntryCache.size(); + for (int i = 0; i < m_desktopEntryCache.size(); i++) { + Process proc(m_desktopEntryCache.at(i)); + proc.readProcessInfo(); + uid_t procUid = proc.uid(); + if (procUid == 0) { + desktopAppNum++; + } + // 判断桌面应用缓存大小 如果不想等则退出当前循环 + if (desktopSize != m_desktopEntryCache.size()) + break; + } + //if user is root,add all numbers of app, otherwise, minuse root user's apps + if (isRootUser) { + return trayAppNum + guiAppNum + desktopAppNum; + } else { + return static_cast(m_trayAppcache.size() + m_guiAppcache.size()) + m_desktopEntryCache.size() - trayAppNum - guiAppNum - desktopAppNum; + } } bool WMWindowList::isTrayApp(pid_t pid) const @@ -193,8 +194,7 @@ QImage WMWindowList::getWindowIcon(pid_t pid) const return {}; uint *data = reinterpret_cast(xcb_get_property_value(reply.get())); - if (data) - { + if (data) { //get the maximum image from data int max_w = 0; int max_h = 0; @@ -233,7 +233,7 @@ QImage WMWindowList::getWindowIcon(pid_t pid) const for (int i = 0; i < byteCount; ++i) { //Save covert uchar* to uint* - (reinterpret_cast(img.bits()))[i] = max_icon[i]; + (reinterpret_cast(img.bits()))[i] = max_icon[i]; } return img; } @@ -268,9 +268,9 @@ QString WMWindowList::getWindowTitle(pid_t pid) const QList WMWindowList::getTrayWindows() const { - QDBusInterface busInterface("com.deepin.dde.TrayManager", "/com/deepin/dde/TrayManager", - "org.freedesktop.DBus.Properties", QDBusConnection::sessionBus()); - QDBusMessage reply = busInterface.call("Get", "com.deepin.dde.TrayManager", "TrayIcons"); + QDBusInterface busInterface(common::systemInfo().TrayManagerService, common::systemInfo().TrayManagerPath, + common::systemInfo().TrayManagerInterface, QDBusConnection::sessionBus()); + QDBusMessage reply = busInterface.call("Get", common::systemInfo().TrayManagerService, "TrayIcons"); QVariant v = reply.arguments().first(); const QDBusArgument &argument = v.value().variant().value(); diff --git a/deepin-system-monitor-plugin-popup/CMakeLists.txt b/deepin-system-monitor-plugin-popup/CMakeLists.txt index 0e15e0b6..6dcfb6c1 100644 --- a/deepin-system-monitor-plugin-popup/CMakeLists.txt +++ b/deepin-system-monitor-plugin-popup/CMakeLists.txt @@ -43,12 +43,10 @@ find_package(DtkCore REQUIRED) find_package(DtkGui REQUIRED) find_package(DtkWidget REQUIRED) find_package(Qt5Svg REQUIRED) -find_library(LIB_PROPS NAMES procps REQUIRED) find_library(LIB_XCB NAMES xcb REQUIRED) find_library(LIB_XEXT NAMES Xext REQUIRED) find_library(LIB_ICCCM NAMES xcb-icccm REQUIRED) find_package(ICU COMPONENTS i18n uc REQUIRED) -find_package(DFrameworkdbus REQUIRED) #安全测试加固编译参数 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -z relro -z now -z noexecstack -pie") @@ -72,6 +70,8 @@ include_directories(${LIB_UDEV_INCLUDE_DIRS}) #include_directories(${QGSettings_INCLUDE_DIRS}) +include_directories(${DtkGui_INCLUDE_DIRS}) +include_directories(${DtkCore_INCLUDE_DIRS}) include_directories(${MAIN_APP_DIR}) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../) @@ -247,6 +247,8 @@ SET(CPP_PROCESS set(APP_HPP ${CMAKE_HOME_DIRECTORY}/config.h application.h + ddlog.h + logger.h ${HPP_MODEL} ${HPP_SYSTEM} ${HPP_GLOBAL} @@ -259,6 +261,7 @@ set(APP_HPP set(APP_CPP application.cpp main.cpp + logger.cpp ${CPP_MODEL} ${CPP_SYSTEM} ${CPP_GLOBAL} @@ -271,7 +274,7 @@ set(APP_CPP add_executable(${PROJECT_NAME} ${APP_HPP} ${APP_CPP} - ${PROJECT_SOURCE_DIR}/${APP_RESOURCES} + ${PROJECT_SOURCE_DIR}/${APP_RESOURCES} ) target_include_directories(${PROJECT_NAME} PUBLIC @@ -280,6 +283,7 @@ target_include_directories(${PROJECT_NAME} PUBLIC ${DtkCore_INCLUDE_DIRS} ${DtkGui_INCLUDE_DIRS} ${DdeDockInterface_INCLUDE_DIRS} + Dtk::Core ) target_link_libraries(${PROJECT_NAME} Qt5::Core @@ -292,7 +296,6 @@ target_link_libraries(${PROJECT_NAME} dtkcore dtkwidget dtkgui - ${LIB_PROCPS} ICU::i18n ICU::uc ${LIB_XCB} @@ -302,11 +305,11 @@ target_link_libraries(${PROJECT_NAME} ${LIB_NL3_ROUTE_LIBRAIES} ${LIB_UDEV_LIBRARIES} ${LIB_DDEDOCK} - ${LIB_DFRAMEWORKDBUS} # gsettings-qt - dframeworkdbus + Dtk::Core ) + #生成qm file(GLOB APP_TS_FILES LIST_DIRECTORIES false translations/*.ts) qt5_add_translation(APP_QM_FILES ${APP_TS_FILES}) diff --git a/deepin-system-monitor-plugin-popup/dbus/dbusdockinterface.cpp b/deepin-system-monitor-plugin-popup/dbus/dbusdockinterface.cpp index cf87dd38..34187c41 100644 --- a/deepin-system-monitor-plugin-popup/dbus/dbusdockinterface.cpp +++ b/deepin-system-monitor-plugin-popup/dbus/dbusdockinterface.cpp @@ -10,9 +10,9 @@ */ DBusDockInterface::DBusDockInterface(QObject *parent) - : QDBusAbstractInterface("com.deepin.dde.Dock", "/com/deepin/dde/Dock", staticInterfaceName(), QDBusConnection::sessionBus(), parent) + : QDBusAbstractInterface(common::systemInfo().DockService, common::systemInfo().DockPath, staticInterfaceName(), QDBusConnection::sessionBus(), parent) { - QDBusConnection::sessionBus().connect(this->service(), this->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged","sa{sv}as", this, SLOT(__propertyChanged__(QDBusMessage))); + QDBusConnection::sessionBus().connect(this->service(), this->path(), common::systemInfo().DockInterface, "PropertiesChanged","sa{sv}as", this, SLOT(__propertyChanged__(QDBusMessage))); } DBusDockInterface::~DBusDockInterface() diff --git a/deepin-system-monitor-plugin-popup/dbus/dbusdockinterface.h b/deepin-system-monitor-plugin-popup/dbus/dbusdockinterface.h index c4147f66..96a15b4b 100644 --- a/deepin-system-monitor-plugin-popup/dbus/dbusdockinterface.h +++ b/deepin-system-monitor-plugin-popup/dbus/dbusdockinterface.h @@ -6,6 +6,8 @@ #ifndef DBUSDOCK_H #define DBUSDOCK_H +#include "helper.hpp" + #include #include #include @@ -14,6 +16,7 @@ #include #include #include + /* * Proxy class for interface local.MainWindow */ @@ -27,7 +30,7 @@ class DBusDockInterface: public QDBusAbstractInterface if (3 != arguments.count()) return; QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName != "com.deepin.dde.Dock") + if (interfaceName != common::systemInfo().DockService) return; QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); foreach(const QString &prop, changedProps.keys()) { @@ -42,7 +45,7 @@ class DBusDockInterface: public QDBusAbstractInterface } public: static inline const char *staticInterfaceName() - { return "com.deepin.dde.Dock"; } + { return (common::systemInfo().isOldVersion() ? "com.deepin.dde.Dock": "org.deepin.dde.Dock1"); } public: explicit DBusDockInterface( QObject *parent = nullptr); diff --git a/deepin-system-monitor-plugin-popup/dbus/systemmonitordbusadaptor.h b/deepin-system-monitor-plugin-popup/dbus/systemmonitordbusadaptor.h index fa35938b..8703e540 100644 --- a/deepin-system-monitor-plugin-popup/dbus/systemmonitordbusadaptor.h +++ b/deepin-system-monitor-plugin-popup/dbus/systemmonitordbusadaptor.h @@ -24,6 +24,10 @@ public slots: signals: Q_SCRIPTABLE void sigSendShowOrHideSystemMonitorPluginPopupWidget(); + //! + //! \brief sysMonPopVisibleChanged 系统监视器弹窗显示状态改变 + //! + Q_SCRIPTABLE void sysMonPopVisibleChanged(bool); }; #endif // SYSTEMMONITORDBUSADAPTOR_H diff --git a/deepin-system-monitor-plugin-popup/ddlog.h b/deepin-system-monitor-plugin-popup/ddlog.h new file mode 100644 index 00000000..5821c6fa --- /dev/null +++ b/deepin-system-monitor-plugin-popup/ddlog.h @@ -0,0 +1,16 @@ +// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef DDLOG_H +#define DDLOG_H +#include +#include +DCORE_USE_NAMESPACE + +namespace DDLog { +inline Q_LOGGING_CATEGORY(app, "org.deepin.system-monitor.plugin.popup") +} + +#endif // DDLOG_H diff --git a/deepin-system-monitor-plugin-popup/gui/cpu_widget.cpp b/deepin-system-monitor-plugin-popup/gui/cpu_widget.cpp index 96c5f255..d9def2a5 100644 --- a/deepin-system-monitor-plugin-popup/gui/cpu_widget.cpp +++ b/deepin-system-monitor-plugin-popup/gui/cpu_widget.cpp @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later - +#include "ddlog.h" #include "cpu_widget.h" #include "common/datacommon.h" #include "datadealsingleton.h" @@ -26,7 +26,7 @@ const int cpuTxtWidth = 96; DWIDGET_USE_NAMESPACE - +using namespace DDLog; CpuWidget::CpuWidget(QWidget *parent) : QWidget(parent) { @@ -47,7 +47,8 @@ CpuWidget::CpuWidget(QWidget *parent) this->installEventFilter(this); } -CpuWidget::~CpuWidget() { +CpuWidget::~CpuWidget() +{ delete downloadSpeeds; } @@ -63,17 +64,19 @@ void CpuWidget::initConnection() void CpuWidget::getPainterPathByData(QList *listData, QPainterPath &path, qreal maxVlaue) { qreal offsetX = 0; - qreal distance = (this->width() - cpuTxtWidth-10) * 1.0 / pointsNumber; + qreal distance = (this->width() - cpuTxtWidth - 10) * 1.0 / pointsNumber; int dataCount = listData->size(); if (maxVlaue < 0.000001) maxVlaue = 1; - for (int i = 0; i < dataCount - 1; i++) { + for (int i = 0; i < dataCount - 1; i++) { //sp 为线段的起始点,ep 为线段的终点 //c1,c2 为贝塞尔曲线的控制点 - QPointF sp = QPointF(offsetX, 20 * listData->at(i) / maxVlaue);; - QPointF ep = QPointF(offsetX + distance, 20 * listData->at(i + 1) / maxVlaue);; + QPointF sp = QPointF(offsetX, 20 * listData->at(i) / maxVlaue); + ; + QPointF ep = QPointF(offsetX + distance, 20 * listData->at(i + 1) / maxVlaue); + ; offsetX += distance; @@ -81,14 +84,14 @@ void CpuWidget::getPainterPathByData(QList *listData, QPainterPath &path QPointF c2 = QPointF((sp.x() + ep.x()) / 2.0, ep.y()); path.cubicTo(c1, c2, ep); -// qInfo()<<"sp, x:"<at(i) / maxVlaue; + // qCInfo(app)<<"sp, x:"<at(i) / maxVlaue; } } void CpuWidget::updateStatus() { if (!DataDealSingleton::getInstance().readCpuPer(m_cpuPer)) - qInfo()<<"false: "<append(m_cpuPer); @@ -161,74 +164,74 @@ void CpuWidget::paintEvent(QPaintEvent *e) //标题栏背景 QRect titleRect(rect().x(), rect().y(), m_width, 36); painter.fillRect(titleRect, QBrush(QColor(255, 255, 255, m_titleTrans))); - QRect contentRect(rect().x(), rect().y()+36, m_width, 75); - painter.fillRect(contentRect, QBrush(QColor(255, 255, 255,m_contentTrans))); + QRect contentRect(rect().x(), rect().y() + 36, m_width, 75); + painter.fillRect(contentRect, QBrush(QColor(255, 255, 255, m_contentTrans))); //标题 QString cpuTitle = DApplication::translate("Cpu.Widget", "CPU"); painter.setFont(m_TitleFont); -// QFontMetrics fmTitle = painter.fontMetrics(); + // QFontMetrics fmTitle = painter.fontMetrics(); int widthTitle = fmTitleContent.width(cpuTitle); - int heightTitle = fmTitleContent.descent()+fmTitleContent.ascent(); + int heightTitle = fmTitleContent.descent() + fmTitleContent.ascent(); QRect cpuTitleRect(titleRect.x(), titleRect.y(), widthTitle, heightTitle); painter.drawText(titleRect, Qt::AlignHCenter | Qt::AlignVCenter, cpuTitle); //图标 int iconSize = 20; - QRect iconRect(titleRect.x()+(titleRect.width()-widthTitle)/2-iconSize, titleRect.y() + qCeil((titleRect.height() - iconSize) / 2.) + 2,iconSize, iconSize); + QRect iconRect(titleRect.x() + (titleRect.width() - widthTitle) / 2 - iconSize, titleRect.y() + qCeil((titleRect.height() - iconSize) / 2.) + 2, iconSize, iconSize); m_icon.paint(&painter, iconRect); //cpu使用率长宽 painter.setFont(m_contentFont); QString cpuStatText = QString::number(m_cpuPer, 'f', 1); int widthCpu = fmContent.size(Qt::TextSingleLine, cpuStatText).width(); - int heightCpu = fmContent.descent()+fmContent.ascent(); + int heightCpu = fmContent.descent() + fmContent.ascent(); //cpu使用率百分号长宽 int widthCpuper = fmContentUnit.size(Qt::TextSingleLine, "%").width(); - int heightCpuper = fmContentUnit.descent()+fmContentUnit.ascent(); + int heightCpuper = fmContentUnit.descent() + fmContentUnit.ascent(); //写cpu使用率和百分号 - QRect cpuUsageRect(contentRect.x()+(cpuTxtWidth - widthCpu-widthCpuper)/2, contentRect.y()+10, widthCpu, heightCpu); + QRect cpuUsageRect(contentRect.x() + (cpuTxtWidth - widthCpu - widthCpuper) / 2, contentRect.y() + 10, widthCpu, heightCpu); painter.drawText(cpuUsageRect, Qt::AlignLeft | Qt::AlignBottom, cpuStatText); painter.setFont(m_contentUnitFont); - QRect cpuperUsageRect(cpuUsageRect.x() + cpuUsageRect.width(), cpuUsageRect.y()+ heightCpu/4, widthCpuper, heightCpuper); + QRect cpuperUsageRect(cpuUsageRect.x() + cpuUsageRect.width(), cpuUsageRect.y() + heightCpu / 4, widthCpuper, heightCpuper); painter.drawText(cpuperUsageRect, Qt::AlignLeft | Qt::AlignBottom, "%"); //总使用率 文本 painter.setOpacity(0.6); painter.setFont(m_subContentFont); int widthcpuText = fmSubContent.size(Qt::TextSingleLine, tr("Utilization")).width(); - QRect cpuTextRect(contentRect.x()+(cpuTxtWidth - widthcpuText)/2, cpuUsageRect.y()+cpuUsageRect.height(), + QRect cpuTextRect(contentRect.x() + (cpuTxtWidth - widthcpuText) / 2, cpuUsageRect.y() + cpuUsageRect.height(), fmSubContent.size(Qt::TextSingleLine, tr("Utilization")).width(), fmSubContent.height()); - painter.drawText(cpuTextRect, Qt::AlignLeft | Qt::AlignTop,tr("Utilization")); + painter.drawText(cpuTextRect, Qt::AlignLeft | Qt::AlignTop, tr("Utilization")); painter.setOpacity(1); //分隔符 int sepheight = 50; - int sepwidth =(contentRect.width() - 92-10)/2; - int rightMax = contentRect.x()+contentRect.width()-10; + int sepwidth = (contentRect.width() - 92 - 10) / 2; + int rightMax = contentRect.x() + contentRect.width() - 10; painter.setFont(m_contentFont); - QRect separatorRect1(contentRect.x()+cpuTxtWidth, contentRect.y()+10, 1, sepheight); - painter.fillRect(separatorRect1, QBrush(QColor(0, 0, 0,20))); - QRect separatorRect2(contentRect.x()+cpuTxtWidth+sepwidth, contentRect.y()+10, 1, sepheight); - painter.fillRect(separatorRect2, QBrush(QColor(0, 0, 0,20))); - QRect separatorRect3(rightMax, contentRect.y()+10, 1, sepheight); - painter.fillRect(separatorRect3, QBrush(QColor(0, 0, 0,20))); + QRect separatorRect1(contentRect.x() + cpuTxtWidth, contentRect.y() + 10, 1, sepheight); + painter.fillRect(separatorRect1, QBrush(QColor(0, 0, 0, 20))); + QRect separatorRect2(contentRect.x() + cpuTxtWidth + sepwidth, contentRect.y() + 10, 1, sepheight); + painter.fillRect(separatorRect2, QBrush(QColor(0, 0, 0, 20))); + QRect separatorRect3(rightMax, contentRect.y() + 10, 1, sepheight); + painter.fillRect(separatorRect3, QBrush(QColor(0, 0, 0, 20))); //走势图 QPainterPath framePath; - QRect chartRect(separatorRect1.x(), separatorRect1.y(), contentRect.width()-cpuTxtWidth-10, sepheight*2); -// framePath.addRect(chartRect); + QRect chartRect(separatorRect1.x(), separatorRect1.y(), contentRect.width() - cpuTxtWidth - 10, sepheight * 2); + // framePath.addRect(chartRect); - QColor Color {"#004EEF"}; + QColor Color { "#004EEF" }; QBrush recvBrush(Color); qreal networkCurveWidth = 1.2; QPainterPath clip; clip.addRect(chartRect); painter.setClipPath(clip); - painter.setRenderHint(QPainter::Antialiasing, true);//反锯齿 + painter.setRenderHint(QPainter::Antialiasing, true); //反锯齿 painter.translate(chartRect.x() + 2, chartRect.y() + chartRect.height() / 2 - 2); painter.scale(1, -1); @@ -271,11 +274,11 @@ void CpuWidget::changeFont(const QFont &font) m_contentFont = font; m_contentFont.setWeight(QFont::Normal); - m_contentFont.setPointSizeF(Globals::ContentFont+3); + m_contentFont.setPointSizeF(Globals::ContentFont + 3); m_contentUnitFont = font; m_contentUnitFont.setWeight(QFont::Normal); - m_contentUnitFont.setPointSizeF(Globals::ContentUnitFont+3); + m_contentUnitFont.setPointSizeF(Globals::ContentUnitFont + 3); m_subContentFont = font; m_subContentFont.setWeight(QFont::ExtraLight); diff --git a/deepin-system-monitor-plugin-popup/gui/datadealsingleton.cpp b/deepin-system-monitor-plugin-popup/gui/datadealsingleton.cpp index 2f658e92..c8591f36 100644 --- a/deepin-system-monitor-plugin-popup/gui/datadealsingleton.cpp +++ b/deepin-system-monitor-plugin-popup/gui/datadealsingleton.cpp @@ -15,24 +15,27 @@ #include "common/datacommon.h" #include "dbus/dbuscallmaininterface.h" #include "config.h" +#include "helper.hpp" +#include "ddlog.h" //Qt #include +#include +#include #ifdef IS_LOONGARCH_TYPE -#define POPUP_WAITING_TIME 1000 +# define POPUP_WAITING_TIME 1000 #else -#define POPUP_WAITING_TIME 500 +# define POPUP_WAITING_TIME 500 #endif - +using namespace DDLog; QMutex DataDealSingleton::mutex; QAtomicPointer DataDealSingleton::instance; DataDealSingleton &DataDealSingleton::getInstance() { - if (instance.testAndSetOrdered(nullptr, nullptr)) - { + if (instance.testAndSetOrdered(nullptr, nullptr)) { QMutexLocker locker(&mutex); instance.testAndSetOrdered(nullptr, new DataDealSingleton); @@ -107,8 +110,14 @@ bool DataDealSingleton::sendJumpWidgetMessage(const QString &dbusMessage) return false; } m_popupTrickTimer->start(); + //1.先唤醒主进程 - bool rt = QProcess::startDetached(Globals::DEEPIN_SYSTEM_MONITOR_PATH); + bool rt = false; + if (common::systemInfo().isOldVersion()) { + rt = QProcess::startDetached(Globals::DEEPIN_SYSTEM_MONITOR_PATH); + } else { + rt = launchMainProcessByAM(); + } if (true == rt) { //2.跳转DBUS QTimer::singleShot(POPUP_WAITING_TIME, this, [=]() { @@ -119,9 +128,8 @@ bool DataDealSingleton::sendJumpWidgetMessage(const QString &dbusMessage) } DataDealSingleton::DataDealSingleton(QObject *parent) - :QObject (parent) - , m_popupTrickTimer(new QTimer(this)) - { + : QObject(parent), m_popupTrickTimer(new QTimer(this)) +{ m_popupTrickTimer->setInterval(1000); m_popupTrickTimer->setSingleShot(true); @@ -130,5 +138,24 @@ DataDealSingleton::DataDealSingleton(QObject *parent) DataDealSingleton::~DataDealSingleton() { +} +bool DataDealSingleton::launchMainProcessByAM() const +{ + QDBusMessage message = QDBusMessage::createMethodCall( + "org.desktopspec.ApplicationManager1", + "/org/desktopspec/ApplicationManager1/deepin_2dsystem_2dmonitor", + "org.desktopspec.ApplicationManager1.Application", + "Launch"); + + message << QString("") << QStringList() << QVariantMap(); + + QDBusMessage reply = QDBusConnection::sessionBus().call(message); + if (reply.type() == QDBusMessage::ReplyMessage) { + qCDebug(app) << "Method call successful!"; + return true; + } else { + qCWarning(app) << "Launch deepin-system-monitor main process error:" << reply.errorMessage(); + return false; + } } diff --git a/deepin-system-monitor-plugin-popup/gui/datadealsingleton.h b/deepin-system-monitor-plugin-popup/gui/datadealsingleton.h index 06fa65ee..09be2822 100644 --- a/deepin-system-monitor-plugin-popup/gui/datadealsingleton.h +++ b/deepin-system-monitor-plugin-popup/gui/datadealsingleton.h @@ -73,6 +73,7 @@ class DataDealSingleton : public QObject ~DataDealSingleton(); DataDealSingleton(const DataDealSingleton &) = delete; DataDealSingleton &operator=(const DataDealSingleton &) = delete; + bool launchMainProcessByAM() const; QReadWriteLock internalMutex; diff --git a/deepin-system-monitor-plugin-popup/gui/mainwindow.cpp b/deepin-system-monitor-plugin-popup/gui/mainwindow.cpp index 90c0aea1..d0a6666e 100644 --- a/deepin-system-monitor-plugin-popup/gui/mainwindow.cpp +++ b/deepin-system-monitor-plugin-popup/gui/mainwindow.cpp @@ -2,11 +2,12 @@ // SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later - +#include "ddlog.h" #include "mainwindow.h" #include "common/datacommon.h" //#include "itemwidget.h" #include "dbus/dbusayatanainterface.h" +#include "helper.hpp" #include #include @@ -27,32 +28,44 @@ #include #include #include +#include +#include -#define DOCK_TOP 0 -#define DOCK_RIGHT 1 -#define DOCK_BOTTOM 2 -#define DOCK_LEFT 3 +#define DOCK_TOP 0 +#define DOCK_RIGHT 1 +#define DOCK_BOTTOM 2 +#define DOCK_LEFT 3 -#define MONITOR_SERVICE "com.deepin.api.XEventMonitor" #define SCREEN_HEIGHT_MAX 1080 -#define NOT_USE_QUIT_TIME_INTERVAL 5*60*1000 +#define NOT_USE_QUIT_TIME_INTERVAL 5 * 60 * 1000 const QString KILL_DBUS_COMMAND = "killall deepin-system-monitor-plugin-popup"; - +using namespace DDLog; MainWindow::MainWindow(QWidget *parent) +#ifdef DTKWIDGET_CLASS_DBlurEffectWithBorderWidget + : DBlurEffectWithBorderWidget(parent) +#else : DBlurEffectWidget(parent) - , m_displayInter(new DBusDisplay("com.deepin.daemon.Display", "/com/deepin/daemon/Display", QDBusConnection::sessionBus(), this)) - , m_daemonDockInter(new DBusDaemonDock("com.deepin.dde.daemon.Dock", "/com/deepin/dde/daemon/Dock", QDBusConnection::sessionBus(), this)) - , m_dockInter(new DBusDockInterface) - , m_systemMonitorDbusAdaptor(new SystemMonitorDBusAdaptor) - , m_regionMonitor(nullptr) - , m_xAni(new QPropertyAnimation(this, "x")) - , m_widthAni(new QPropertyAnimation(this, "width")) - , m_aniGroup(new QSequentialAnimationGroup(this)) - , m_trickTimer(new QTimer(this)) - , m_processEndTimer(new QTimer(this)) +#endif + , + m_displayInter(new QDBusInterface(common::systemInfo().DISPLAY_SERVICE, + common::systemInfo().DISPLAY_PATH, + common::systemInfo().DISPLAY_INTERFACE, + QDBusConnection::sessionBus(), this)), + m_daemonDockInter(new QDBusInterface(common::systemInfo().DOCK_SERVICE, + common::systemInfo().DOCK_PATH, + common::systemInfo().DOCK_INTERFACE, + QDBusConnection::sessionBus(), this)), + m_dockInter(new DBusDockInterface), + m_systemMonitorDbusAdaptor(new SystemMonitorDBusAdaptor), + m_regionMonitor(nullptr), + m_xAni(new QPropertyAnimation(this, "x")), + m_widthAni(new QPropertyAnimation(this, "width")), + m_aniGroup(new QSequentialAnimationGroup(this)), + m_trickTimer(new QTimer(this)), + m_processEndTimer(new QTimer(this)) { m_trickTimer->setInterval(300); m_trickTimer->setSingleShot(true); @@ -61,7 +74,19 @@ MainWindow::MainWindow(QWidget *parent) m_processEndTimer->start(); //在构造函数中存储m_displayInter->monitor()中的内容,解决内存泄漏的问题 - m_dbusPathList = m_displayInter->monitors(); + if (m_displayInter->isValid()) { + auto ss = m_displayInter->property("Monitors"); + + QDBusInterface busInterface(common::systemInfo().DISPLAY_SERVICE, + common::systemInfo().DISPLAY_PATH, + "org.freedesktop.DBus.Properties", QDBusConnection::sessionBus()); + QDBusMessage reply = busInterface.call("Get", common::systemInfo().DISPLAY_INTERFACE, "Monitors"); + QVariant v = reply.arguments().first(); + const QDBusArgument &argument = v.value().variant().value(); + while (!argument.atEnd()) { + argument >> m_dbusPathList; + } + } initDBus(); initUI(); initAni(); @@ -77,7 +102,6 @@ MainWindow::MainWindow(QWidget *parent) MainWindow::~MainWindow() { - } void MainWindow::Toggle() @@ -121,8 +145,14 @@ void MainWindow::showAni() qreal scale = qApp->primaryScreen()->devicePixelRatio(); m_trickTimer->start(); if (!m_hasComposite) { - if (m_daemonDockInter->position() == DOCK_RIGHT) { - if (m_daemonDockInter->displayMode() == 0) { + int dockPos = DOCK_TOP; + int displayMode = 0; + if (m_daemonDockInter->isValid()) { + dockPos = m_daemonDockInter->property("Position").toInt(); + displayMode = m_daemonDockInter->property("DisplayMode").toInt(); + } + if (m_daemonDockInter->isValid() && dockPos == DOCK_RIGHT) { + if (displayMode == 0) { setGeometry(getDisplayScreen().x() + int(std::round(qreal(getDisplayScreen().width())) / scale) - m_rect.width() - m_dockInter->geometry().width() - Globals::WindowMargin - 2 * Globals::DockMargin, m_rect.y(), m_rect.width(), m_rect.height()); } else { setGeometry(getDisplayScreen().x() + int(std::round(qreal(getDisplayScreen().width())) / scale) - m_rect.width() - m_dockInter->geometry().width() - Globals::WindowMargin, m_rect.y(), m_rect.width(), m_rect.height()); @@ -163,7 +193,7 @@ void MainWindow::hideAni() m_aniGroup->setDirection(QAbstractAnimation::Forward); m_aniGroup->start(); - QTimer::singleShot(m_aniGroup->duration(), this, [ = ] {setVisible(false);}); + QTimer::singleShot(m_aniGroup->duration(), this, [=] { setVisible(false); }); } void MainWindow::startLoader() @@ -226,7 +256,7 @@ void MainWindow::registerMonitor() } m_regionMonitor = new DRegionMonitor(this); m_regionMonitor->registerRegion(QRegion(QRect())); - connect(m_regionMonitor, &DRegionMonitor::buttonPress, this, [ = ](const QPoint & p, const int flag) { + connect(m_regionMonitor, &DRegionMonitor::buttonPress, this, [=](const QPoint &p, const int flag) { Q_UNUSED(flag); if (!geometry().contains(p)) if (!isHidden()) { @@ -237,7 +267,7 @@ void MainWindow::registerMonitor() void MainWindow::initUI() { - setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::MSWindowsFixedSizeDialogHint | Qt::WindowStaysOnTopHint); + setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::MSWindowsFixedSizeDialogHint | Qt::WindowStaysOnTopHint); setAttribute(Qt::WA_TranslucentBackground); setFixedWidth(Globals::WindowWidth); @@ -301,49 +331,50 @@ void MainWindow::initAni() void MainWindow::initConnect() { - connect(m_displayInter, &DBusDisplay::PrimaryRectChanged, this, &MainWindow::geometryChanged, Qt::QueuedConnection); + QDBusConnection::sessionBus().connect(m_displayInter->service(), m_displayInter->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(dbusPropertiesChanged(QString, QVariantMap, QStringList))); connect(m_dockInter, &DBusDockInterface::geometryChanged, this, &MainWindow::geometryChanged, Qt::UniqueConnection); connect(this, SIGNAL(signal_geometry(int)), m_processWidget, SLOT(autoHeight(int))); connect(m_systemMonitorDbusAdaptor, &SystemMonitorDBusAdaptor::sigSendShowOrHideSystemMonitorPluginPopupWidget, this, &MainWindow::slotShowOrHideSystemMonitorPluginPopupWidget); + //系统监视器弹窗显示状态改变 + connect(this, &MainWindow::sysMonPopVisibleChanged, + m_systemMonitorDbusAdaptor, &SystemMonitorDBusAdaptor::sysMonPopVisibleChanged); + connect(DWindowManagerHelper::instance(), &DWindowManagerHelper::hasCompositeChanged, this, &MainWindow::CompositeChanged, Qt::QueuedConnection); - connect(m_widthAni, &QVariantAnimation::valueChanged, this, [ = ](const QVariant & value) { + connect(m_widthAni, &QVariantAnimation::valueChanged, this, [=](const QVariant &value) { int width = value.toInt(); -// move(int(std::round(qreal(m_rect.x() + m_rect.width() + Globals::WindowMargin - width)) / qApp->primaryScreen()->devicePixelRatio()), m_rect.y()); - move(int(std::round(qreal(m_rect.x() + m_rect.width() + Globals::WindowMargin - width))), m_rect.y()); + // move(int(std::round(qreal(m_rect.x() + m_rect.width() + Globals::WindowMargin - width)) / qApp->primaryScreen()->devicePixelRatio()), m_rect.y()); + move(int(std::round(qreal(m_rect.x() + m_rect.width() + Globals::WindowMargin - width))), m_rect.y()); }); - QDBusServiceWatcher *m_watcher = new QDBusServiceWatcher(MONITOR_SERVICE, QDBusConnection::sessionBus()); - connect(m_watcher, &QDBusServiceWatcher::serviceRegistered, this, [ = ](const QString & service) { - if (MONITOR_SERVICE != service) + QDBusServiceWatcher *m_watcher = new QDBusServiceWatcher(common::systemInfo().MONITOR_SERVICE, QDBusConnection::sessionBus()); + connect(m_watcher, &QDBusServiceWatcher::serviceRegistered, this, [=](const QString &service) { + if (common::systemInfo().MONITOR_SERVICE != service) return; registerMonitor(); }); - connect(m_watcher, &QDBusServiceWatcher::serviceUnregistered, this, [ = ](const QString & service) { - if (MONITOR_SERVICE != service) + connect(m_watcher, &QDBusServiceWatcher::serviceUnregistered, this, [=](const QString &service) { + if (common::systemInfo().MONITOR_SERVICE != service) return; disconnect(m_regionMonitor); }); // 设置窗口透明度调节 - connect(m_daemonDockInter, &DBusDaemonDock::OpacityChanged, this, [ = ]() { - this->setMaskAlpha(static_cast(m_daemonDockInter->opacity() * 255)); - }); + QDBusConnection::sessionBus().connect(m_daemonDockInter->service(), m_daemonDockInter->path(), "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(dbusPropertiesChanged(QString, QVariantMap, QStringList))); // 去除通过智能语音助手唤醒时关闭系统监视器窗口 -// connect(DBusAyatanaInterface::getInstance(), &DBusAyatanaInterface::sigSendCloseWidget, this, [=]() { QTimer::singleShot(0, this, &MainWindow::hideAni); }); + // connect(DBusAyatanaInterface::getInstance(), &DBusAyatanaInterface::sigSendCloseWidget, this, [=]() { QTimer::singleShot(0, this, &MainWindow::hideAni); }); //5分钟没人使用,结束popup进程 connect(m_processEndTimer, &QTimer::timeout, this, []() { - qInfo() << "time is up! end process!"; + qCInfo(app) << "time is up! end process!"; QProcess::startDetached(KILL_DBUS_COMMAND); }); - } void MainWindow::changeTheme(DApplicationHelper::ColorType themeType) @@ -371,6 +402,15 @@ void MainWindow::changeTheme(DApplicationHelper::ColorType themeType) setBackgroundRole(DPalette::Window); } +void MainWindow::dbusPropertiesChanged(QString interface, QVariantMap maps, QStringList strs) +{ + if ((interface == common::systemInfo().DISPLAY_INTERFACE && maps.contains("PrimaryRect")) || (interface == common::systemInfo().DOCK_INTERFACE && (maps.contains("Position") || maps.contains("DisplayMode")))) { + geometryChanged(); + } else if (m_daemonDockInter->isValid() && interface == common::systemInfo().DOCK_INTERFACE && maps.contains("Opacity")) { + this->setMaskAlpha(static_cast(m_daemonDockInter->property("Opacity").toDouble() * 255)); + } +} + void MainWindow::adjustPosition() { // 屏幕尺寸 @@ -389,30 +429,34 @@ void MainWindow::adjustPosition() rect -= QMargins(0, Globals::WindowMargin, Globals::WindowMargin, Globals::WindowMargin); // 初始化弹出框位置 - switch (m_daemonDockInter->position()) { - case DOCK_TOP: - rect.moveTop(dockRect.height() + Globals::WindowMargin); - rect.setHeight(rect.height() - dockHeight); - rect.moveRight(getDisplayScreen().x() + int(std::round(qreal(getDisplayScreen().width())) / scale) - Globals::WindowMargin); - break; - case DOCK_BOTTOM: - rect.setHeight(rect.height() - dockHeight); - rect.moveRight(getDisplayScreen().x() + int(std::round(qreal(getDisplayScreen().width())) / scale) - Globals::WindowMargin); - break; - case DOCK_LEFT: - rect.moveRight(int(std::round(qreal(getDisplayScreen().width())) / scale) - Globals::WindowMargin); - dockHeight = 0; - break; - case DOCK_RIGHT: - if (m_daemonDockInter->displayMode() == 0) { - rect.moveRight(getDisplayScreen().x() + int(std::round(qreal(getDisplayScreen().width())) / scale) - dockRect.width() - 2 * Globals::WindowMargin); - } else { - rect.moveRight(getDisplayScreen().x() + int(std::round(qreal(getDisplayScreen().width())) / scale) - dockRect.width() - Globals::WindowMargin); + if (m_daemonDockInter->isValid()) { + int dockPos = m_daemonDockInter->property("Position").toInt(); + int displayMode = m_daemonDockInter->property("DisplayMode").toInt(); + switch (dockPos) { + case DOCK_TOP: + rect.moveTop(dockRect.height() + Globals::WindowMargin); + rect.setHeight(rect.height() - dockHeight); + rect.moveRight(getDisplayScreen().x() + int(std::round(qreal(getDisplayScreen().width())) / scale) - Globals::WindowMargin); + break; + case DOCK_BOTTOM: + rect.setHeight(rect.height() - dockHeight); + rect.moveRight(getDisplayScreen().x() + int(std::round(qreal(getDisplayScreen().width())) / scale) - Globals::WindowMargin); + break; + case DOCK_LEFT: + rect.moveRight(int(std::round(qreal(getDisplayScreen().width())) / scale) - Globals::WindowMargin); + dockHeight = 0; + break; + case DOCK_RIGHT: + if (displayMode == 0) { + rect.moveRight(getDisplayScreen().x() + int(std::round(qreal(getDisplayScreen().width())) / scale) - dockRect.width() - 2 * Globals::WindowMargin); + } else { + rect.moveRight(getDisplayScreen().x() + int(std::round(qreal(getDisplayScreen().width())) / scale) - dockRect.width() - Globals::WindowMargin); + } + dockHeight = 0; + break; + default: + break; } - dockHeight = 0; - break; - default: - break; } int scrollHeight = rect.height() - 20; @@ -429,16 +473,20 @@ void MainWindow::adjustPosition() // 针对时尚模式的特殊处理 // 只有任务栏显示的时候, 才额外偏移 - if (m_daemonDockInter->displayMode() == 0 && dockRect.width() * dockRect.height() > 0) { - switch (m_daemonDockInter->position()) { - case DOCK_TOP: - rect -= QMargins(0, Globals::WindowMargin, 0, 0); - break; - case DOCK_BOTTOM: - rect -= QMargins(0, 0, 0, Globals::WindowMargin); - break; - default: - break; + if (m_daemonDockInter->isValid()) { + int dockPos = m_daemonDockInter->property("Position").toInt(); + int displayMode = m_daemonDockInter->property("DisplayMode").toInt(); + if (displayMode == 0 && dockRect.width() * dockRect.height() > 0) { + switch (dockPos) { + case DOCK_TOP: + rect -= QMargins(0, Globals::WindowMargin, 0, 0); + break; + case DOCK_BOTTOM: + rect -= QMargins(0, 0, 0, Globals::WindowMargin); + break; + default: + break; + } } } @@ -447,16 +495,54 @@ void MainWindow::adjustPosition() setFixedSize(rect.size()); } +struct PrimaryRect +{ + qint16 x; + qint16 y; + qint16 width; + qint16 height; +}; + +const QDBusArgument &operator>>(const QDBusArgument &argument, PrimaryRect &rect) +{ + argument.beginStructure(); + argument >> rect.x; + argument >> rect.y; + argument >> rect.width; + argument >> rect.height; + argument.endStructure(); + return argument; +} + QRect MainWindow::getDisplayScreen() { QRect dockRect = m_dockInter->geometry(); for (const auto &monitorPath : m_dbusPathList) { - DisplayMonitor monitor("com.deepin.daemon.Display", monitorPath.path(), QDBusConnection::sessionBus()); - QRect screenRect(monitor.x(), monitor.y(), monitor.width(), monitor.height()); - if (screenRect.contains(dockRect)) - return screenRect; + QDBusInterface monitor(common::systemInfo().DISPLAY_INTERFACE, monitorPath.path(), common::systemInfo().DISPLAYMONITOR_INTERFACE, QDBusConnection::sessionBus()); + if (monitor.isValid()) { + int curX = m_displayInter->property("X").toInt(); + int curY = m_displayInter->property("X").toInt(); + int curWidth = m_displayInter->property("X").toInt(); + int curHeight = m_displayInter->property("X").toInt(); + QRect screenRect(curX, curY, curWidth, curHeight); + if (screenRect.contains(dockRect)) + return screenRect; + } + } + if (m_displayInter->isValid()) { + QDBusInterface busInterface(common::systemInfo().DISPLAY_SERVICE, common::systemInfo().DISPLAY_PATH, + "org.freedesktop.DBus.Properties", QDBusConnection::sessionBus()); + QDBusMessage reply = busInterface.call("Get", common::systemInfo().DISPLAY_INTERFACE, "PrimaryRect"); + QVariant v = reply.arguments().first(); + const QDBusArgument &argument = v.value().variant().value(); + + PrimaryRect primaryRect; + while (!argument.atEnd()) { + argument >> primaryRect; + } + return QRect(primaryRect.x, primaryRect.y, primaryRect.width, primaryRect.height); } - return m_displayInter->primaryRect(); + return dockRect; } bool MainWindow::initDBus() @@ -472,9 +558,8 @@ bool MainWindow::initDBus() } // 在挂载的服务上注册一个执行服务的对象 - if (!QDBusConnection::sessionBus().registerObject(Globals::SERVICE_PATH, m_systemMonitorDbusAdaptor, QDBusConnection::ExportAllSlots | - QDBusConnection::ExportAllSignals)) { - qInfo() << QDBusConnection::sessionBus().lastError(); + if (!QDBusConnection::sessionBus().registerObject(Globals::SERVICE_PATH, m_systemMonitorDbusAdaptor, QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals)) { + qCInfo(app) << QDBusConnection::sessionBus().lastError(); return false; } @@ -511,3 +596,14 @@ void MainWindow::slotShowOrHideSystemMonitorPluginPopupWidget() QTimer::singleShot(0, this, &MainWindow::Toggle); } +void MainWindow::showEvent(QShowEvent *event) +{ + Q_EMIT sysMonPopVisibleChanged(true); + QWidget::showEvent(event); +} + +void MainWindow::hideEvent(QHideEvent *event) +{ + Q_EMIT sysMonPopVisibleChanged(false); + QWidget::hideEvent(event); +} diff --git a/deepin-system-monitor-plugin-popup/gui/mainwindow.h b/deepin-system-monitor-plugin-popup/gui/mainwindow.h index e534e157..11d1bcde 100644 --- a/deepin-system-monitor-plugin-popup/gui/mainwindow.h +++ b/deepin-system-monitor-plugin-popup/gui/mainwindow.h @@ -20,18 +20,16 @@ // Qt #include +#ifdef DTKWIDGET_CLASS_DBlurEffectWithBorderWidget +#include +#else #include +#endif #include #include #include #include -// Dtk -#include -#include -#include - - DWIDGET_USE_NAMESPACE DGUI_USE_NAMESPACE @@ -39,26 +37,32 @@ QT_FORWARD_DECLARE_CLASS(QPushButton) QT_FORWARD_DECLARE_CLASS(QPropertyAnimation) QT_FORWARD_DECLARE_CLASS(QSequentialAnimationGroup) - -using DBusDisplay = com::deepin::daemon::Display; -using DisplayMonitor = com::deepin::daemon::display::Monitor; -using DBusDaemonDock = com::deepin::dde::daemon::Dock; - /*! * \~chinese \class MainWindow * \~chinese \brief 主窗口类 */ +#ifdef DTKWIDGET_CLASS_DBlurEffectWithBorderWidget +class MainWindow : public DBlurEffectWithBorderWidget +#else class MainWindow : public DBlurEffectWidget +#endif { Q_OBJECT Q_PROPERTY(int width READ getWidth WRITE setFixedWidth) Q_PROPERTY(int x WRITE setX) + Q_PROPERTY(bool sysMonPopVisible READ sysMonPopVisible NOTIFY sysMonPopVisibleChanged) + public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow() override; Q_SIGNALS: void signal_geometry(int height); + /*! + * \brief sysMonPopVisibleChanged 系统监视器弹窗显示状态改变 + * \param visible + */ + void sysMonPopVisibleChanged(bool visible); public Q_SLOTS: /*! @@ -102,6 +106,12 @@ private Q_SLOTS: void registerMonitor(); + /*! + * \brief sysMonPopVisible 系统监视器弹窗显示状态 + * \return + */ + bool sysMonPopVisible() const{ return isVisible();} + private: /*! * \~chinese \name initUI @@ -146,6 +156,8 @@ private Q_SLOTS: virtual bool eventFilter(QObject *object, QEvent *event) override; + virtual void showEvent(QShowEvent *event) override; + virtual void hideEvent(QHideEvent *event) override; private slots: void slotShowOrHideSystemMonitorPluginPopupWidget(); //! @@ -153,12 +165,17 @@ private slots: //! \param themeType 主题类型 //! void changeTheme(DApplicationHelper::ColorType themeType); + //! + //! \brief dbusPropertiesChanged 获取属性变化信号 + //! \param interface 接口,maps 数据,strs 名称 + //! + void dbusPropertiesChanged(QString interface,QVariantMap maps,QStringList strs); private: - DBusDisplay *m_displayInter; + QDBusInterface *m_displayInter; //用于存储m_displayInter->monitor()中的内容,解决内存泄漏的问题 QList m_dbusPathList {}; - DBusDaemonDock *m_daemonDockInter; + QDBusInterface *m_daemonDockInter; DBusDockInterface *m_dockInter; SystemMonitorDBusAdaptor *m_systemMonitorDbusAdaptor; DRegionMonitor *m_regionMonitor; diff --git a/deepin-system-monitor-plugin-popup/gui/memory_widget.cpp b/deepin-system-monitor-plugin-popup/gui/memory_widget.cpp index 148bf705..e083a818 100644 --- a/deepin-system-monitor-plugin-popup/gui/memory_widget.cpp +++ b/deepin-system-monitor-plugin-popup/gui/memory_widget.cpp @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later - +#include "ddlog.h" #include "memory_widget.h" #include "../common/utils.h" #include "common/datacommon.h" @@ -27,7 +27,7 @@ DWIDGET_USE_NAMESPACE using namespace Utils; - +using namespace DDLog; MemoryWidget::MemoryWidget(QWidget *parent) : QWidget(parent) { @@ -49,25 +49,22 @@ MemoryWidget::MemoryWidget(QWidget *parent) } MemoryWidget::~MemoryWidget() {} - void MemoryWidget::updateStatus() { QString memUsage, memTotal, memPercent, swapUsage, swapTotal, swapPercent; if (!DataDealSingleton::getInstance().readMemInfo(memUsage, memTotal, memPercent, swapUsage, swapTotal, swapPercent)) - qInfo()<<"failed"; -// qInfo()<<"swapUsage: "< +#include + +#include +using namespace DDLog; +DCORE_USE_NAMESPACE + +MLogger::MLogger(QObject *parent) + : QObject(parent), m_rules(""), m_config(nullptr) +{ + QByteArray logRules = qgetenv("QT_LOGGING_RULES"); + // qunsetenv 之前一定不要有任何日志打印,否则取消环境变量设置不会生效 + qunsetenv("QT_LOGGING_RULES"); + + // set env + m_rules = logRules; + + // set dconfig + m_config = DConfig::create("deepin-system-monitor-plugin-popup", "deepin-system-monitor-plugin-popup"); + logRules = m_config->value("log_rules").toByteArray(); + appendRules(logRules); + setRules(m_rules); + + // watch dconfig + connect(m_config, &DConfig::valueChanged, this, [this](const QString &key) { + qCCritical(app) << "value changed:" << key; + if (key == "log_rules") { + setRules(m_config->value(key).toByteArray()); + } + }); +} + +MLogger::~MLogger() +{ + m_config->deleteLater(); +} + +void MLogger::setRules(const QString &rules) +{ + auto tmpRules = rules; + m_rules = tmpRules.replace(";", "\n"); + QLoggingCategory::setFilterRules(m_rules); +} + +void MLogger::appendRules(const QString &rules) +{ + QString tmpRules = rules; + tmpRules = tmpRules.replace(";", "\n"); + auto tmplist = tmpRules.split('\n'); + for (int i = 0; i < tmplist.count(); i++) + if (m_rules.contains(tmplist.at(i))) { + tmplist.removeAt(i); + i--; + } + if (tmplist.isEmpty()) + return; + m_rules.isEmpty() ? m_rules = tmplist.join("\n") + : m_rules += "\n" + tmplist.join("\n"); +} diff --git a/deepin-system-monitor-plugin-popup/logger.h b/deepin-system-monitor-plugin-popup/logger.h new file mode 100644 index 00000000..946fa7a3 --- /dev/null +++ b/deepin-system-monitor-plugin-popup/logger.h @@ -0,0 +1,28 @@ +// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#include +#include + +DCORE_BEGIN_NAMESPACE +class DConfig; +DCORE_END_NAMESPACE + +class MLogger : public QObject +{ + Q_OBJECT +public: + explicit MLogger(QObject *parent = nullptr); + ~MLogger(); + + inline QString rules() const { return m_rules; } + void setRules(const QString &rules); + +private: + void appendRules(const QString &rules); + +private: + QString m_rules; + Dtk::Core::DConfig *m_config; +}; diff --git a/deepin-system-monitor-plugin-popup/main.cpp b/deepin-system-monitor-plugin-popup/main.cpp index 291d6ffb..b0729f39 100644 --- a/deepin-system-monitor-plugin-popup/main.cpp +++ b/deepin-system-monitor-plugin-popup/main.cpp @@ -6,23 +6,39 @@ #include "gui/mainwindow.h" #include "dde-dock/constants.h" #include "application.h" +#include "ddlog.h" //#include "clipboard_adaptor.h" - +#include "logger.h" #include #include #include #include #include - - DGUI_USE_NAMESPACE DWIDGET_USE_NAMESPACE DCORE_USE_NAMESPACE +using namespace DDLog; + int main(int argc, char *argv[]) { +#ifdef DTKCORE_CLASS_DConfigFile + MLogger(); // 日志处理要放在app之前,否则QApplication + // 内部可能进行了日志打印,导致环境变量设置不生效 +#endif + +// 为了兼容性 +#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 8, 0)) + Dtk::Core::DLogManager::registerJournalAppender(); +#else + Dtk::Core::DLogManager::registerFileAppender(); +#endif +#ifdef QT_DEBUG + Dtk::Core::DLogManager::registerConsoleAppender(); +#endif + // 前置wayland环境变量 if (!qgetenv("WAYLAND_DISPLAY").isEmpty()) { qputenv("QT_QPA_PLATFORM", "wayland"); @@ -32,7 +48,7 @@ int main(int argc, char *argv[]) DGuiApplicationHelper::setUseInactiveColorGroup(false); DGuiApplicationHelper::setColorCompositingEnabled(true); -// DApplication *app = DApplication::globalApplication(argc, argv); + // DApplication *app = DApplication::globalApplication(argc, argv); Application::setAttribute(Qt::AA_UseHighDpiPixmaps, true); Application ac(argc, argv); @@ -43,9 +59,8 @@ int main(int argc, char *argv[]) ac.setApplicationDisplayName("deepin-system-monitor-plugin-popup"); ac.setApplicationVersion("1.0"); - if (!DGuiApplicationHelper::setSingleInstance(QString("deepin-system-monitor-plugin-popup"))) { - qDebug() << "set single instance failed!"; + qCDebug(app) << "set single instance failed!"; return -1; } @@ -55,10 +70,10 @@ int main(int argc, char *argv[]) gApp->setMainWindow(&w); QDBusInterface interface("com.deepin.SystemMonitorPluginPopup", "/com/deepin/SystemMonitorPluginPopup", - "com.deepin.SystemMonitorPluginPopup", - QDBusConnection::sessionBus()); + "com.deepin.SystemMonitorPluginPopup", + QDBusConnection::sessionBus()); if (!interface.isValid()) { - qDebug() << "start loader..."; + qCDebug(app) << "start loader..."; w.startLoader(); } #ifdef QT_DEBUG diff --git a/deepin-system-monitor-plugin-popup/model/process_table_model.cpp b/deepin-system-monitor-plugin-popup/model/process_table_model.cpp index 6ea03402..d704954f 100644 --- a/deepin-system-monitor-plugin-popup/model/process_table_model.cpp +++ b/deepin-system-monitor-plugin-popup/model/process_table_model.cpp @@ -16,6 +16,7 @@ using namespace common; using namespace common::format; +DGUI_USE_NAMESPACE // using namespace Dtk::Gui; // model constructor ProcessTableModel::ProcessTableModel(QObject *parent) diff --git a/deepin-system-monitor-plugin-popup/process/process.cpp b/deepin-system-monitor-plugin-popup/process/process.cpp index faa20e98..773a8f40 100644 --- a/deepin-system-monitor-plugin-popup/process/process.cpp +++ b/deepin-system-monitor-plugin-popup/process/process.cpp @@ -536,7 +536,9 @@ void Process::readSockInodes() if (!stat(fdp, &sbuf)) { // get inode if it's a socket descriptor if (S_ISSOCK(sbuf.st_mode)) { - d->sockInodes << sbuf.st_ino; + if (!d->sockInodes.contains(sbuf.st_ino)) { + d->sockInodes << sbuf.st_ino; + } } } // ::if(stat) } // ::if(isdigit) diff --git a/deepin-system-monitor-plugin-popup/process/process_db.cpp b/deepin-system-monitor-plugin-popup/process/process_db.cpp index eb56e63b..8a3e021f 100644 --- a/deepin-system-monitor-plugin-popup/process/process_db.cpp +++ b/deepin-system-monitor-plugin-popup/process/process_db.cpp @@ -148,7 +148,7 @@ void ProcessDB::sendSignalToProcess(pid_t pid, int signal) } else if (signal == SIGKILL) { Q_EMIT processKilled(pid); } else { - qWarning() << "Unexpected signal in this case:" << signal; + qCWarning(app) << "Unexpected signal in this case:" << signal; } }; auto fmsg = [ = ](int signal) -> QString { diff --git a/deepin-system-monitor-plugin/CMakeLists.txt b/deepin-system-monitor-plugin/CMakeLists.txt index f82d2b7d..3f814dbe 100644 --- a/deepin-system-monitor-plugin/CMakeLists.txt +++ b/deepin-system-monitor-plugin/CMakeLists.txt @@ -26,17 +26,27 @@ find_package(Qt5Svg REQUIRED) find_package(Qt5DBus REQUIRED) find_package(DtkWidget REQUIRED) -pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) pkg_check_modules(QGSettings REQUIRED gsettings-qt) -pkg_check_modules(DdeDockInterface REQUIRED dde-dock) +pkg_check_modules(DdeDockInterface REQUIRED dde-dock) + +if (DdeDockInterface_FOUND) + message("dde-dock founded: ${DdeDockInterface_VERSION}") + string(REGEX MATCH "^[0-9]" VERSION_MAJOR ${DdeDockInterface_VERSION}) + if (VERSION_MAJOR STREQUAL "6" OR VERSION_MAJOR STRGREATER "6") + add_definitions(-DDDE_DOCK_MAJORV6) + endif() +endif() add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN") add_library(${PROJECT_NAME} SHARED ${SRCS} ${APP_RESOURCES}) set_target_properties(${PROJECT_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../) + +include_directories(${DtkCore_INCLUDE_DIRS}) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../) + target_include_directories(${PROJECT_NAME} PUBLIC ${DdeDockInterface_INCLUDE_DIRS} ${DtkWidget_INCLUDE_DIRS} - ${DFrameworkDBus_INCLUDE_DIRS} ${QGSettings_INCLUDE_DIRS} ) @@ -45,7 +55,6 @@ target_link_libraries(${PROJECT_NAME} PRIVATE ${DtkWidget_LIBRARIES} ${Qt5Widgets_LIBRARIES} ${Qt5Svg_LIBRARIES} - ${DFrameworkDBus_LIBRARIES} ${QGSettings_LIBRARIES} ) @@ -63,8 +72,7 @@ qt5_add_translation(APP_QM_FILES ${APP_TS_FILES}) add_custom_target(PLUGIN_QMFILES ALL DEPENDS ${APP_QM_FILES}) INSTALL(FILES com.deepin.dde.dock.module.system-monitor.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas) -INSTALL(FILES com.deepin.system.monitor.plugin.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas) +#INSTALL(FILES com.deepin.system.monitor.plugin.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas) INSTALL(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION lib/dde-dock/plugins) #安装翻译文件 install(FILES ${APP_QM_FILES} DESTINATION ${CMAKE_INSTALL_DATADIR}/deepin-system-monitor-plugin/translations) - diff --git a/deepin-system-monitor-plugin/ddlog.h b/deepin-system-monitor-plugin/ddlog.h new file mode 100644 index 00000000..b4de84c3 --- /dev/null +++ b/deepin-system-monitor-plugin/ddlog.h @@ -0,0 +1,15 @@ +// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#ifndef DDLOG_H +#define DDLOG_H +#include +#include +DCORE_USE_NAMESPACE + +namespace DDLog { +inline Q_LOGGING_CATEGORY(app, "org.deepin.system-monitor.plugin") +} + +#endif // DDLOG_H diff --git a/deepin-system-monitor-plugin/gui/commoniconbutton.cpp b/deepin-system-monitor-plugin/gui/commoniconbutton.cpp new file mode 100644 index 00000000..78cff3c0 --- /dev/null +++ b/deepin-system-monitor-plugin/gui/commoniconbutton.cpp @@ -0,0 +1,195 @@ +// SPDX-FileCopyrightText: 2019 - 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: LGPL-3.0-or-later +#include "commoniconbutton.h" + +#include +#include +#include + +#include + +DGUI_USE_NAMESPACE + +CommonIconButton::CommonIconButton(QWidget *parent) + : QWidget(parent) + , m_refreshTimer(nullptr) + , m_rotateAngle(0) + , m_clickable(false) + , m_rotatable(false) + , m_hover(false) + , m_state(Default) + , m_activeState(false) +{ + setAccessibleName("IconButton"); + setFixedSize(24, 24); + if (parent) + setForegroundRole(parent->foregroundRole()); + + connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &CommonIconButton::refreshIcon); +} + +void CommonIconButton::setStateIconMapping(QMap> mapping) +{ + m_fileMapping = mapping; +} + +void CommonIconButton::setState(State state) +{ + m_state = state; + if (m_fileMapping.contains(state)) { + auto pair = m_fileMapping.value(state); + setIcon(pair.first, pair.second); + } + if (!m_icon.isNull()) { + setIcon(m_icon, m_lightThemeColor, m_darkThemeColor); + } +} + +void CommonIconButton::setIcon(const QIcon &icon, QColor lightThemeColor, QColor darkThemeColor) +{ + m_icon = icon; + if (lightThemeColor.isValid() && darkThemeColor.isValid()) { + m_lightThemeColor = lightThemeColor; + m_darkThemeColor = darkThemeColor; + QColor color = DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType ? m_lightThemeColor : m_darkThemeColor; + if (m_activeState) + color = palette().color(QPalette::Highlight); + auto pa = palette(); + pa.setColor(QPalette::WindowText, color); + setPalette(pa); + } + + update(); +} + +void CommonIconButton::setActiveState(bool state) +{ + m_activeState = state; + if (m_lightThemeColor.isValid() && m_darkThemeColor.isValid()) { + setIcon(m_icon, m_lightThemeColor, m_darkThemeColor); + } else { + setForegroundRole(state ? QPalette::Highlight : QPalette::NoRole); + } +} + +void CommonIconButton::setIcon(const QString &icon, const QString &fallback, const QString &suffix) +{ + if (!m_fileMapping.contains(Default)) { + m_fileMapping.insert(Default, QPair(icon, fallback)); + } + + QString tmp = icon; + QString tmpFallback = fallback; + + static auto addDarkMark = [suffix] (QString &file) { + if (file.contains(suffix)) { + file.replace(suffix, "-dark" + suffix); + } else { + file.append("-dark"); + } + }; + if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { + addDarkMark(tmp); + addDarkMark(tmpFallback); + } + m_icon = QIcon::fromTheme(tmp, QIcon::fromTheme(tmpFallback)); + update(); +} + +void CommonIconButton::setHoverIcon(const QIcon &icon) +{ + m_hoverIcon = icon; +} + +void CommonIconButton::setClickable(bool clickable) +{ + m_clickable = clickable; +} + +void CommonIconButton::setRotatable(bool rotatable) +{ + m_rotatable = rotatable; + if (!m_rotatable) { + if (m_refreshTimer) + delete m_refreshTimer; + m_refreshTimer = nullptr; + } +} + +void CommonIconButton::startRotate() +{ + if (!m_refreshTimer) { + m_refreshTimer = new QTimer(this); + m_refreshTimer->setInterval(50); + connect(m_refreshTimer, &QTimer::timeout, this, &CommonIconButton::startRotate); + } + m_refreshTimer->start(); + m_rotateAngle += 54; + update(); + if (m_rotateAngle >= 360) { + stopRotate(); + } +} + +void CommonIconButton::stopRotate() +{ + m_refreshTimer->stop(); + m_rotateAngle = 0; + update(); +} + +bool CommonIconButton::event(QEvent *e) +{ + switch (e->type()) { + case QEvent::Leave: + case QEvent::Enter: + m_hover = e->type() == QEvent::Enter; + update(); + break; + default: + break; + } + return QWidget::event(e); +} + +void CommonIconButton::paintEvent(QPaintEvent *e) +{ + QWidget::paintEvent(e); + QPainter painter(this); + painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); + + if (m_rotateAngle != 0) { + painter.translate(this->width() / 2, this->height() / 2); + painter.rotate(m_rotateAngle); + painter.translate(-(this->width() / 2), -(this->height() / 2)); + } + + if (m_hover && !m_hoverIcon.isNull()) { + m_hoverIcon.paint(&painter, rect()); + } else if (!m_icon.isNull()) { + m_icon.paint(&painter, rect()); + } +} + +void CommonIconButton::mousePressEvent(QMouseEvent *event) +{ + m_pressPos = event->pos(); + return QWidget::mousePressEvent(event); +} + +void CommonIconButton::mouseReleaseEvent(QMouseEvent *event) +{ + if (m_clickable && rect().contains(m_pressPos) && rect().contains(event->pos()) && (!m_refreshTimer || !m_refreshTimer->isActive())) { + if (m_rotatable) + startRotate(); + Q_EMIT clicked(); + return; + } + return QWidget::mouseReleaseEvent(event); +} + +void CommonIconButton::refreshIcon() +{ + setState(m_state); +} \ No newline at end of file diff --git a/deepin-system-monitor-plugin/gui/commoniconbutton.h b/deepin-system-monitor-plugin/gui/commoniconbutton.h new file mode 100644 index 00000000..d44477eb --- /dev/null +++ b/deepin-system-monitor-plugin/gui/commoniconbutton.h @@ -0,0 +1,68 @@ +// SPDX-FileCopyrightText: 2019 - 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: LGPL-3.0-or-later +#ifndef ICONBUTTON_H +#define ICONBUTTON_H + +#include +#include +#include + +class CommonIconButton : public QWidget +{ +public: + enum State { + Default, + On, + Off + }; + + Q_OBJECT +public: + explicit CommonIconButton(QWidget *parent = nullptr); + + void setStateIconMapping(QMap> mapping); + void setState(State state); + void setActiveState(bool state); + bool activeState() const { return m_activeState; } + +public Q_SLOTS: + void setIcon(const QString &icon, const QString &fallback = "", const QString &suffix = ".svg"); + void setIcon(const QIcon &icon, QColor lightThemeColor = QColor(), QColor darkThemeColor = QColor()); + void setHoverIcon(const QIcon &icon); + + void setClickable(bool clickable); + void setRotatable(bool rotatable); + +signals: + void clicked(); + +protected: + bool event(QEvent *e) override; + void paintEvent(QPaintEvent *e) override; + void mousePressEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; + + void startRotate(); + void stopRotate(); + +private: + void refreshIcon(); + +private: + QTimer *m_refreshTimer; + QIcon m_icon; + QIcon m_hoverIcon; + QPoint m_pressPos; + int m_rotateAngle; + bool m_clickable; + bool m_rotatable; + bool m_hover; + QMap> m_fileMapping; + State m_state; + QColor m_lightThemeColor; + QColor m_darkThemeColor; + bool m_activeState; +}; + +#endif // DOCKICONBUTTON_H diff --git a/deepin-system-monitor-plugin/gui/monitor_plugin.cpp b/deepin-system-monitor-plugin/gui/monitor_plugin.cpp index 81e2c2db..791c6e87 100644 --- a/deepin-system-monitor-plugin/gui/monitor_plugin.cpp +++ b/deepin-system-monitor-plugin/gui/monitor_plugin.cpp @@ -4,7 +4,8 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "monitor_plugin.h" - +#include "helper.hpp" +#include "ddlog.h" // Qt #include #include @@ -14,24 +15,25 @@ #include #include #include +#include +#include namespace constantVal { const QString PLUGIN_STATE_KEY = "enable"; } DWIDGET_USE_NAMESPACE - +using namespace DDLog; MonitorPlugin::MonitorPlugin(QObject *parent) - : QObject(parent) - , m_pluginLoaded(false) - , m_dataTipsLabel(nullptr) - , m_refershTimer(new QTimer(this)) + : QObject(parent), m_pluginLoaded(false), m_dataTipsLabel(nullptr), m_refershTimer(new QTimer(this)) +#ifdef USE_API_QUICKPANEL20 + , + m_quickPanelWidget(new QuickPanelWidget), + m_messageCallback(nullptr) +#endif { - if (QGSettings::isSchemaInstalled("com.deepin.system.monitor.plugin")) { - m_settings = new QGSettings("com.deepin.system.monitor.plugin", "/com/deepin/system/monitor/plugin/", this); - } - connect(m_refershTimer, &QTimer::timeout, this, &MonitorPlugin::udpateTipsInfo); + qCInfo(app) << __FUNCTION__ << __LINE__ << "[-MonitorPlugin-]"; } const QString MonitorPlugin::pluginName() const @@ -59,30 +61,69 @@ void MonitorPlugin::init(PluginProxyInterface *proxyInter) loadPlugin(); } +#ifdef USE_API_QUICKPANEL20 + m_proxyInter->itemAdded(this, pluginName()); + m_quickPanelWidget->setDescription(pluginDisplayName()); + QString plugIcon = DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType ? "status-system-monitor-dark" : "status-system-monitor"; + QIcon fallbackIcon = QIcon::fromTheme(DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType ? "dsm_pluginicon_dark" : "dsm_pluginicon_light"); + m_quickPanelWidget->setIcon(QIcon::fromTheme(plugIcon, fallbackIcon)); + connect(m_quickPanelWidget, &QuickPanelWidget::clicked, this, &MonitorPlugin::onClickQuickPanel); + qCInfo(app) << __FUNCTION__ << __LINE__ << "[-MonitorPlugin-] QUICKPANEL20"; + QDBusConnection::sessionBus().connect("com.deepin.SystemMonitorPluginPopup", "/com/deepin/SystemMonitorPluginPopup", "com.deepin.SystemMonitorPluginPopup", "sysMonPopVisibleChanged", this, SLOT(onSysMonPopVisibleChanged(bool))); +#endif + calcCpuRate(m_totalCPU, m_availableCPU); calcNetRate(m_down, m_upload); +#ifdef DDE_DOCK_NEW_VERSION + qCInfo(app) << __FUNCTION__ << __LINE__ << "[-MonitorPlugin-] V23"; +#endif } QWidget *MonitorPlugin::itemWidget(const QString &itemKey) { + qCInfo(app) << __FUNCTION__ << __LINE__ << "[-MonitorPlugin-]" << itemKey; +#ifdef DDE_DOCK_NEW_VERSION +// if (itemKey == "system-monitor") +// return m_itemWidget; +#else +# ifdef USE_API_QUICKPANEL20 + if (itemKey == Dock::QUICK_ITEM_KEY) { + return m_quickPanelWidget; + } +# endif if (itemKey == "system-monitor") return m_itemWidget; +#endif return nullptr; } void MonitorPlugin::pluginStateSwitched() { - bool pluginState = !m_proxyInter->getValue(this, constantVal::PLUGIN_STATE_KEY, false).toBool(); - m_proxyInter->saveValue(this, constantVal::PLUGIN_STATE_KEY, pluginState); - - refreshPluginItemsVisible(); +#ifndef DDE_DOCK_NEW_VERSION + const bool disabledNew = !pluginIsDisable(); + m_proxyInter->saveValue(this, "disabled", disabledNew); + if (disabledNew) { + m_proxyInter->itemRemoved(this, pluginName()); + } else { + if (!m_pluginLoaded) { + loadPlugin(); + return; + } + m_proxyInter->itemAdded(this, pluginName()); + } +#endif } - +#ifndef DDE_DOCK_NEW_VERSION bool MonitorPlugin::pluginIsDisable() { - return !m_proxyInter->getValue(this, constantVal::PLUGIN_STATE_KEY, false).toBool(); +# ifdef USE_API_QUICKPANEL20 + return false; +# else + return m_proxyInter->getValue(this, "disabled", true).toBool(); +# endif } +#endif QWidget *MonitorPlugin::itemTipsWidget(const QString &itemKey) { @@ -94,11 +135,13 @@ QWidget *MonitorPlugin::itemTipsWidget(const QString &itemKey) const QString MonitorPlugin::itemCommand(const QString &itemKey) { if (itemKey == "system-monitor") { - DBusInterface::getInstance()->showOrHideDeepinSystemMonitorPluginPopupWidget(); + // Task 30767: 暂时调整为打开系统监视器,隐藏系统监视器插件 + // DBusInterface::getInstance()->showOrHideDeepinSystemMonitorPluginPopupWidget(); + openSystemMonitor(); } return ""; -// return "dbus-send --print-reply --dest=com.deepin.SystemMonitorPluginPopup /com/deepin/SystemMonitorPluginPopup com.deepin.SystemMonitorPluginPopup.showOrHideDeepinSystemMonitorPluginPopupWidget"; + // return "dbus-send --print-reply --dest=com.deepin.SystemMonitorPluginPopup /com/deepin/SystemMonitorPluginPopup com.deepin.SystemMonitorPluginPopup.showOrHideDeepinSystemMonitorPluginPopupWidget"; } void MonitorPlugin::displayModeChanged(const Dock::DisplayMode displayMode) @@ -107,6 +150,9 @@ void MonitorPlugin::displayModeChanged(const Dock::DisplayMode displayMode) if (!pluginIsDisable()) { m_itemWidget->update(); +#ifdef USE_API_QUICKPANEL20 + m_quickPanelWidget->update(); +#endif } } @@ -149,27 +195,66 @@ void MonitorPlugin::invokedMenuItem(const QString &itemKey, const QString &menuI Q_UNUSED(checked); Q_UNUSED(itemKey); if (menuId == "openSystemMointor") { - QProcess::startDetached("/usr/bin/deepin-system-monitor"); + openSystemMonitor(); + } +} - //QString cmd("qdbus com.deepin.SystemMonitorMain /com/deepin/SystemMonitorMain com.deepin.SystemMonitorMain.slotRaiseWindow"); - QString cmd("gdbus call -e -d com.deepin.SystemMonitorMain -o /com/deepin/SystemMonitorMain -m com.deepin.SystemMonitorMain.slotRaiseWindow"); - QTimer::singleShot(200, this, [ = ]() { QProcess::startDetached(cmd); }); +#ifdef DDE_DOCK_NEW_VERSION +QIcon MonitorPlugin::icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType) +{ + QString iconName = "dsm_pluginicon_light"; + if (themeType == DGuiApplicationHelper::LightType) { + // 最小尺寸时,不画背景,采用深色图标 + iconName = "dsm_pluginicon_dark"; + } + QSize size = QSize(16, 16); + if (dockPart == DockPart::DCCSetting) { + size = QSize(20, 20); + } else if (dockPart == DockPart::QuickPanel) { + size = QSize(24, 24); } + QIcon icon = QIcon::fromTheme(iconName); + if (!icon.isNull()) { + const qreal ratio = m_itemWidget->devicePixelRatioF(); + QSize pixmapSize = QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? size : size * ratio; + QPixmap pixmap = icon.pixmap(pixmapSize); + pixmap.setDevicePixelRatio(ratio); + if (dockPart == DockPart::QuickShow) { + QPixmap curPixmap(size * ratio); + pixmap.setDevicePixelRatio(ratio); + curPixmap.fill(Qt::transparent); + QPainter painter; + painter.begin(&curPixmap); + painter.setRenderHint(QPainter::SmoothPixmapTransform); + int pixmapMargin = ceil(1 * ratio); + painter.drawPixmap(QRect(pixmapMargin, pixmapMargin, curPixmap.width() - pixmapMargin, curPixmap.height() - pixmapMargin), pixmap); + painter.end(); + return QIcon(curPixmap); + } else { + return QIcon(pixmap); + } + } + return icon; } +#endif -void MonitorPlugin::udpateTipsInfo() +void MonitorPlugin::udpateInfo() { // memory qlonglong memory = 0; qlonglong memoryAll = 0; calcMemRate(memory, memoryAll); - m_memStr = QString("%1").arg(memory * 100.0 / memoryAll, 1, 'f', 1, QLatin1Char(' ')); + m_memStr = QString("%1").arg(memory * 100.0 / memoryAll, 1, 'f', 1, QLatin1Char(' ')) + QString("%"); // CPU qlonglong totalCPU = 0; qlonglong availableCPU = 0; calcCpuRate(totalCPU, availableCPU); - m_cpuStr = QString("%1").arg((((totalCPU - m_totalCPU) - (availableCPU - m_availableCPU)) * 100.0 / (totalCPU - m_totalCPU)), 1, 'f', 1, QLatin1Char(' ')); + double cpuPercent = 0.0; + if (totalCPU != m_totalCPU) { + cpuPercent = ((totalCPU - m_totalCPU) - (availableCPU - m_availableCPU)) * 100.0 / (totalCPU - m_totalCPU); + } + m_cpuStr = QString("%1").arg(cpuPercent, 1, 'f', 1, QLatin1Char(' ')) + QString("%"); m_totalCPU = totalCPU; m_availableCPU = availableCPU; @@ -191,7 +276,11 @@ void MonitorPlugin::udpateTipsInfo() m_down = netDownload; m_upload = netUpload; +} +void MonitorPlugin::udpateTipsInfo() +{ + udpateInfo(); m_dataTipsLabel->setSystemMonitorTipsText(QStringList() << m_cpuStr << m_memStr << m_downloadStr << m_uploadStr); } @@ -200,57 +289,32 @@ void MonitorPlugin::loadPlugin() if (m_pluginLoaded) return; - initPluginState(); - m_pluginLoaded = true; m_dataTipsLabel.reset(new SystemMonitorTipsWidget); m_dataTipsLabel->setObjectName("systemmonitorpluginlabel"); - m_refershTimer->setInterval(2000); - m_refershTimer->start(); - - m_itemWidget = new MonitorPluginButtonWidget; + m_refershTimer->setInterval(1000); + // m_refershTimer->start(); - if (!m_isFirstInstall) { - // 非初始状态 - if (m_proxyInter->getValue(this, constantVal::PLUGIN_STATE_KEY, true).toBool()) { - m_proxyInter->itemAdded(this, pluginName()); + connect(m_dataTipsLabel.get(), &SystemMonitorTipsWidget::visibleChanged, this, [=](bool visible) { + if (!visible) { + m_refershTimer->stop(); } else { - m_proxyInter->saveValue(this, constantVal::PLUGIN_STATE_KEY, false); - m_proxyInter->itemRemoved(this, pluginName()); + udpateInfo(); + m_dataTipsLabel->setSystemMonitorTipsText(QStringList() << "..." + << "..." + << "..." + << "..."); + m_refershTimer->start(); } - } else { - m_proxyInter->saveValue(this, constantVal::PLUGIN_STATE_KEY, false); - m_proxyInter->itemRemoved(this, pluginName()); - } + }); - displayModeChanged(displayMode()); -} + m_itemWidget = new MonitorPluginButtonWidget; -void MonitorPlugin::refreshPluginItemsVisible() -{ - if (pluginIsDisable()) { - m_proxyInter->itemRemoved(this, pluginName()); - } else { - if (!m_pluginLoaded) { - loadPlugin(); - return; - } - m_proxyInter->itemAdded(this, pluginName()); - } -} + m_proxyInter->itemAdded(this, pluginName()); -void MonitorPlugin::initPluginState() -{ - if (m_settings == nullptr) - return; - if (m_settings->get("isfirstinstall").toBool()) { - m_isFirstInstall = true; - m_settings->set("isfirstinstall", false); - } else { - m_isFirstInstall = false; - } + displayModeChanged(displayMode()); } void MonitorPlugin::calcCpuRate(qlonglong &totalCPU, qlonglong &availableCPU) @@ -283,7 +347,7 @@ void MonitorPlugin::calcMemRate(qlonglong &memory, qlonglong &memoryAll) return; QTextStream stream(&file); - qlonglong buff[16] = {0}; + qlonglong buff[16] = { 0 }; for (int i = 0; i <= 15; ++i) { QString line = stream.readLine(); QStringList list = line.split(QRegExp("\\s{1,}")); @@ -312,7 +376,7 @@ void MonitorPlugin::calcNetRate(qlonglong &netDown, qlonglong &netUpload) line = stream.readLine(); while (!line.isNull()) { line = line.trimmed(); - QStringList list = line.split(QRegExp("\\s{1,}")); // match number >= 1 space character + QStringList list = line.split(QRegExp("\\s{1,}")); // match number >= 1 space character if (!list.isEmpty()) { down = list.at(1).toLongLong(); @@ -380,9 +444,57 @@ double MonitorPlugin::autoRateUnits(qlonglong speed, RateUnit &unit) sp = static_cast(speed / qPow(2, 40) * 1.0); } else { unit = RateUnknow; - qDebug() << "本设备网络速率单位传输超过 TB, 或者低于 0 Byte."; + qCDebug(app) << "本设备网络速率单位传输超过 TB, 或者低于 0 Byte."; sp = -1; } return sp; } + +void MonitorPlugin::openSystemMonitor() +{ + QProcess::startDetached("/usr/bin/deepin-system-monitor"); + + //QString cmd("qdbus com.deepin.SystemMonitorMain /com/deepin/SystemMonitorMain com.deepin.SystemMonitorMain.slotRaiseWindow"); + QString cmd("gdbus call -e -d com.deepin.SystemMonitorMain -o /com/deepin/SystemMonitorMain -m com.deepin.SystemMonitorMain.slotRaiseWindow"); + QTimer::singleShot(200, this, [=]() { QProcess::startDetached(cmd); }); +#ifdef USE_API_QUICKPANEL20 + qCInfo(app) << __FUNCTION__ << __LINE__ << "[-MonitorPlugin-] right ClickQuickPanel"; + m_proxyInter->requestSetAppletVisible(this, pluginName(), false); +#endif +} + +#ifdef USE_API_QUICKPANEL20 +MonitorPlugin::~MonitorPlugin() +{ + if (m_quickPanelWidget) { + delete m_quickPanelWidget; + m_quickPanelWidget = nullptr; + } +} + +void MonitorPlugin::onClickQuickPanel() +{ + qCInfo(app) << __FUNCTION__ << __LINE__ << "[-MonitorPlugin-] ClickQuickPanel"; + m_proxyInter->requestSetAppletVisible(this, pluginName(), false); + + // Task 30767: 暂时调整为打开系统监视器,隐藏系统监视器插件 + // DBusInterface::getInstance()->showOrHideDeepinSystemMonitorPluginPopupWidget(); + openSystemMonitor(); +} + +//系统监视器弹窗显示状态改变 +void MonitorPlugin::onSysMonPopVisibleChanged(bool visible) +{ + if (!m_messageCallback) { + qCWarning(app) << "Message callback function is nullptr"; + return; + } + QJsonObject msg; + msg[Dock::MSG_TYPE] = Dock::MSG_ITEM_ACTIVE_STATE; + msg[Dock::MSG_DATA] = visible; + QJsonDocument doc; + doc.setObject(msg); + m_messageCallback(this, doc.toJson()); +} +#endif diff --git a/deepin-system-monitor-plugin/gui/monitor_plugin.h b/deepin-system-monitor-plugin/gui/monitor_plugin.h index de43ecbb..418ec7f1 100644 --- a/deepin-system-monitor-plugin/gui/monitor_plugin.h +++ b/deepin-system-monitor-plugin/gui/monitor_plugin.h @@ -7,7 +7,26 @@ #define MONITORPLUGIN_H // smo-plugin +#include +/* to void //1070 and V23 exist same time */ +#ifdef DOCK_API_VERSION +#if (DOCK_API_VERSION >= DOCK_API_VERSION_CHECK(2, 0, 0)) + #define USE_API_QUICKPANEL20 //1070 +#endif +#endif + +#ifndef USE_API_QUICKPANEL20 +#ifdef DDE_DOCK_MAJORV6 + #define DDE_DOCK_NEW_VERSION +#endif +#endif + +#ifdef USE_API_QUICKPANEL20 +#include +#include "quickpanelwidget.h" +#else #include +#endif #include "monitorpluginbuttonwidget.h" #include "dbus/dbusinterface.h" @@ -23,18 +42,28 @@ #include #include +#ifdef USE_API_QUICKPANEL20 +using namespace Dock; +#define DOCK_DEFAULT_POS -1 +#define PLUGIN_INTERDACE PluginsItemInterfaceV2 +#define PLUGIN_METADATA() Q_PLUGIN_METADATA(IID ModuleInterface_iid_V2 FILE "system-monitor_20.json") +#else #define DOCK_DEFAULT_POS 0 +#define PLUGIN_INTERDACE PluginsItemInterface +#define PLUGIN_METADATA() Q_PLUGIN_METADATA(IID "com.deepin.dock.PluginsItemInterface" FILE "system-monitor.json") +#endif class QGSettings; //! //! \brief The MonitorPlugin class //! 实现插件接口对象的类 //! -class MonitorPlugin : public QObject, PluginsItemInterface +class MonitorPlugin : public QObject, PLUGIN_INTERDACE { Q_OBJECT - Q_INTERFACES(PluginsItemInterface) - Q_PLUGIN_METADATA(IID "com.deepin.dock.PluginsItemInterface" FILE "system-monitor.json") + Q_INTERFACES(PLUGIN_INTERDACE) + PLUGIN_METADATA(); + public: enum RateUnit { RateBit, @@ -52,7 +81,10 @@ class MonitorPlugin : public QObject, PluginsItemInterface //! \param parent 传递的父对象指针 //! explicit MonitorPlugin(QObject *parent = Q_NULLPTR); - +#ifdef USE_API_QUICKPANEL20 + //! \brief ~MonitorPlugin 析构函数 + ~MonitorPlugin(); +#endif // 以下是必须要实现的PluginsItemInterface接口 //! //! \brief pluginName 返回插件名称,用于在dde-dock内部管理插件时使用 @@ -82,6 +114,7 @@ class MonitorPlugin : public QObject, PluginsItemInterface //! void pluginStateSwitched() Q_DECL_OVERRIDE; +#ifndef DDE_DOCK_NEW_VERSION //! //! \brief pluginIsAllowDisable 返回插件是否允许被禁用(默认不允许被禁用) //! \return @@ -93,7 +126,7 @@ class MonitorPlugin : public QObject, PluginsItemInterface //! \return //! bool pluginIsDisable() Q_DECL_OVERRIDE; - +#endif //! //! \brief itemTipsWidget 返回鼠标悬浮在插件主控件上时显示的提示框控件 //! \param itemKey @@ -143,28 +176,50 @@ class MonitorPlugin : public QObject, PluginsItemInterface //! void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) Q_DECL_OVERRIDE; +#ifdef DDE_DOCK_NEW_VERSION + /// + /// the icon for the plugin + /// themeType {0:UnknownType 1:LightType 2:DarkType} + /// + QIcon icon(const DockPart &dockPart, DGuiApplicationHelper::ColorType themeType = DGuiApplicationHelper::instance()->themeType()) Q_DECL_OVERRIDE; +#endif +#ifdef USE_API_QUICKPANEL20 + //! + //! the flags for the plugin + //! + Dock::PluginFlags flags() const { return Dock::Type_Quick | Dock::Quick_Panel_Single | Dock::Attribute_Normal; } + //此接口只有在PluginsItemInterfaceV2下才可用 + virtual void setMessageCallback(MessageCallbackFunc cb) override { m_messageCallback = cb; } +#endif + private slots: + //! + //! \brief udpateInfo 更新CPU MEM NET信息 + //! + void udpateInfo(); //! //! \brief udpateTipsInfo 更新CPU MEM NET信息 //! void udpateTipsInfo(); -private: +#ifdef USE_API_QUICKPANEL20 //! - //! \brief loadPlugin 加载插件 + //! \brief onClickQuickPanel mouse event active //! - void loadPlugin(); + void onClickQuickPanel(); //! - //! \brief refreshPluginItemsVisible 刷新插件项显示隐藏 + //! \brief onSysMonPopVisibleChanged 系统监视器弹窗显示状态改变 //! - void refreshPluginItemsVisible(); + void onSysMonPopVisibleChanged(bool); +#endif +private: //! - //! \brief initPluginState 初始化插件状态 + //! \brief loadPlugin 加载插件 //! - void initPluginState(); + void loadPlugin(); //! //! \brief calcCpuRate 计算CPU占用率 @@ -204,15 +259,22 @@ private slots: //! double autoRateUnits(qlonglong speed, RateUnit &unit); + //! + //! \brief openSystemMonitor 打开系统监视器主界面 + //! + void openSystemMonitor(); + private: - bool m_pluginLoaded; +#ifdef USE_API_QUICKPANEL20 + QuickPanelWidget *m_quickPanelWidget; + //此类型(MessageCallbackFunc)属于PluginsItemInterfaceV2 + MessageCallbackFunc m_messageCallback; +#endif + bool m_pluginLoaded; MonitorPluginButtonWidget *m_itemWidget = nullptr; - QScopedPointer m_dataTipsLabel; - QGSettings *m_settings; - qlonglong m_down = 0; qlonglong m_upload = 0; qlonglong m_totalCPU = 0; @@ -222,8 +284,6 @@ private slots: QString startup; - bool m_isFirstInstall = false;//判断插件是否第一次安装 - QString m_cpuStr{"0.0"}; //转换后的cpu数据 QString m_memStr{"0.0"}; //转换后的mem数据 QString m_downloadStr{"0KB/s"}; //转换后的下载数据 diff --git a/deepin-system-monitor-plugin/gui/monitorpluginbuttonwidget.cpp b/deepin-system-monitor-plugin/gui/monitorpluginbuttonwidget.cpp index 7be61112..4399e3f4 100644 --- a/deepin-system-monitor-plugin/gui/monitorpluginbuttonwidget.cpp +++ b/deepin-system-monitor-plugin/gui/monitorpluginbuttonwidget.cpp @@ -38,7 +38,8 @@ void MonitorPluginButtonWidget::paintEvent(QPaintEvent *e) { Q_UNUSED(e) - QString iconName = "dsm_pluginicon_light"; + QString iconName = "status-system-monitor"; + QString fallbackIconName = "dsm_pluginicon_light"; QPixmap pixmap; int iconSize = PLUGIN_ICON_MAX_SIZE; @@ -84,13 +85,14 @@ void MonitorPluginButtonWidget::paintEvent(QPaintEvent *e) painter.fillPath(path, color); } else if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { // 最小尺寸时,不画背景,采用深色图标 - iconName = "dsm_pluginicon_dark"; + iconName = "status-system-monitor-dark"; + fallbackIconName = "dsm_pluginicon_dark"; } const auto ratio = devicePixelRatioF(); painter.setOpacity(1); - pixmap = loadSvg(iconName, ":/icons/deepin/builtin/actions/", iconSize, ratio); + pixmap = loadSvg(iconName, fallbackIconName, ":/icons/deepin/builtin/actions/", iconSize, ratio); const QRectF &rf = QRectF(rect()); const QRectF &rfp = QRectF(pixmap.rect()); @@ -155,9 +157,10 @@ void MonitorPluginButtonWidget::leaveEvent(QEvent *event) QWidget::leaveEvent(event); } -const QPixmap MonitorPluginButtonWidget::loadSvg(const QString &iconName, const QString &localPath, const int size, const qreal ratio) +const QPixmap MonitorPluginButtonWidget::loadSvg(const QString &iconName, const QString &fallbackIconName, const QString &localPath, const int size, const qreal ratio) { - QIcon icon = QIcon::fromTheme(iconName); + QIcon fallbackIcon = QIcon::fromTheme(fallbackIconName); + QIcon icon = QIcon::fromTheme(iconName, fallbackIcon); int pixmapSize = QCoreApplication::testAttribute(Qt::AA_UseHighDpiPixmaps) ? size : int(size * ratio); if (!icon.isNull()) { QPixmap pixmap = icon.pixmap(pixmapSize); @@ -166,7 +169,7 @@ const QPixmap MonitorPluginButtonWidget::loadSvg(const QString &iconName, const } QPixmap pixmap(pixmapSize, pixmapSize); - QString localIcon = QString("%1%2%3").arg(localPath).arg(iconName + "_20px").arg(iconName.contains(".svg") ? "" : ".svg"); + QString localIcon = QString("%1%2%3").arg(localPath).arg(fallbackIconName + "_20px").arg(fallbackIconName.contains(".svg") ? "" : ".svg"); QSvgRenderer renderer(localIcon); pixmap.fill(Qt::transparent); diff --git a/deepin-system-monitor-plugin/gui/monitorpluginbuttonwidget.h b/deepin-system-monitor-plugin/gui/monitorpluginbuttonwidget.h index 7ea82c32..5dc77fb7 100644 --- a/deepin-system-monitor-plugin/gui/monitorpluginbuttonwidget.h +++ b/deepin-system-monitor-plugin/gui/monitorpluginbuttonwidget.h @@ -58,12 +58,13 @@ class MonitorPluginButtonWidget :public QWidget //! \brief loadSvg 加载SVG图标 //! \param iconName 图标名称 + //! \param fallbackIconName 备用图标名称,没有系统图标,就使用资源文件的图标 //! \param localPath 图标路径 //! \param size 图标大小 //! \param ratio 缩放比例 //! \return //! - const QPixmap loadSvg(const QString &iconName, const QString &localPath, const int size, const qreal ratio); + const QPixmap loadSvg(const QString &iconName, const QString &fallbackIconName, const QString &localPath, const int size, const qreal ratio); //! //! \brief containCursorPos 是否鼠标在界面上 //! \return diff --git a/deepin-system-monitor-plugin/gui/quickpanelwidget.cpp b/deepin-system-monitor-plugin/gui/quickpanelwidget.cpp new file mode 100644 index 00000000..4d5b49c9 --- /dev/null +++ b/deepin-system-monitor-plugin/gui/quickpanelwidget.cpp @@ -0,0 +1,105 @@ +// SPDX-FileCopyrightText: 2019 - 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: LGPL-3.0-or-later + +#include "quickpanelwidget.h" + +#include + +#include +#include +#include +#ifdef DTKWIDGET_CLASS_DToolTip +#include +#endif + + +QuickPanelWidget::QuickPanelWidget(QWidget* parent) + :QWidget(parent) + , m_icon(new CommonIconButton(this)) + , m_description(new DLabel(this)) +{ + initUI(); + connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, &QuickPanelWidget::refreshBg); +} + +QuickPanelWidget::~QuickPanelWidget() +{ + +} + +void QuickPanelWidget::initUI() +{ + m_icon->setFixedSize(QSize(24, 24)); + + m_description->setElideMode(Qt::ElideRight); +#ifdef DTKWIDGET_CLASS_DToolTip + #if DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0) + // 此接口和枚举在5.6.4及之后提供 + DToolTip::setToolTipShowMode(m_description, DToolTip::ShowWhenElided); + #endif +#endif + DFontSizeManager::instance()->bind(m_description, DFontSizeManager::T10); + + auto layout = new QVBoxLayout; + layout->setMargin(8); + layout->setSpacing(0); + layout->addStretch(1); + layout->addWidget(m_icon, 0, Qt::AlignCenter); + layout->addSpacing(8); + layout->addWidget(m_description, 0, Qt::AlignCenter); + layout->addStretch(1); + + setLayout(layout); +} + +void QuickPanelWidget::setIcon(const QIcon &icon) +{ + m_icon->setIcon(icon, Qt::black, Qt::white); +} + +void QuickPanelWidget::setDescription(const QString &description) +{ + m_description->setText(description); +} + +void QuickPanelWidget::setWidgetState(WidgetState state) +{ + if (m_icon) + m_icon->setActiveState(WS_ACTIVE == state); + + refreshBg(); +} + +void QuickPanelWidget::mouseReleaseEvent(QMouseEvent *event) +{ + if (underMouse()) { + Q_EMIT clicked(); + } +} + +void QuickPanelWidget::paintEvent(QPaintEvent *event) +{ + QPainter painter(this); + painter.setRenderHint(QPainter::RenderHint::Antialiasing); + if (m_icon->activeState() && DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType) { + painter.setBrush(QColor(255, 255, 255, 255 * 0.8)); + } else { + painter.setBrush(Qt::transparent); + } + painter.setPen(Qt::NoPen); + painter.drawRoundedRect(rect(), 8, 8); + + QWidget::paintEvent(event); +} + +void QuickPanelWidget::refreshBg() +{ + QString plugIcon = DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType ? "status-system-monitor-dark" : "status-system-monitor"; + QIcon fallbackIcon = QIcon::fromTheme(DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType ? "dsm_pluginicon_dark" : "dsm_pluginicon_light"); + setIcon(QIcon::fromTheme(plugIcon, fallbackIcon)); + + m_description->setForegroundRole(m_icon->activeState() && DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType ? QPalette::Highlight : QPalette::NoRole); + update(); +} + diff --git a/deepin-system-monitor-plugin/gui/quickpanelwidget.h b/deepin-system-monitor-plugin/gui/quickpanelwidget.h new file mode 100644 index 00000000..8e5c57f7 --- /dev/null +++ b/deepin-system-monitor-plugin/gui/quickpanelwidget.h @@ -0,0 +1,49 @@ +// SPDX-FileCopyrightText: 2019 - 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: LGPL-3.0-or-later + +#ifndef QUICKPANELWIDGET_H +#define QUICKPANELWIDGET_H + +#include "commoniconbutton.h" + +#include +#include + +DWIDGET_USE_NAMESPACE + +class QuickPanelWidget : public QWidget +{ + Q_OBJECT + +public: + enum WidgetState { + WS_NORMAL, + WS_ACTIVE, + }; + QuickPanelWidget(QWidget *parent = nullptr); + ~QuickPanelWidget(); + + void setIcon(const QIcon &icon); + void setDescription(const QString &description); + void setWidgetState(WidgetState state); + +Q_SIGNALS: + void clicked(); + +protected: + void mouseReleaseEvent(QMouseEvent *event) override; + void paintEvent(QPaintEvent *event) override; + +private: + void initUI(); + +private slots: + void refreshBg(); + +private: + CommonIconButton *m_icon; + DLabel *m_description; +}; + +#endif diff --git a/deepin-system-monitor-plugin/gui/systemmonitortipswidget.cpp b/deepin-system-monitor-plugin/gui/systemmonitortipswidget.cpp index 7ac9f03a..1414c439 100644 --- a/deepin-system-monitor-plugin/gui/systemmonitortipswidget.cpp +++ b/deepin-system-monitor-plugin/gui/systemmonitortipswidget.cpp @@ -4,14 +4,14 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "systemmonitortipswidget.h" - +#include "ddlog.h" #include #include #include #include DWIDGET_USE_NAMESPACE - +using namespace DDLog; SystemMonitorTipsWidget::SystemMonitorTipsWidget(QWidget *parent) : QFrame(parent) { @@ -19,7 +19,7 @@ SystemMonitorTipsWidget::SystemMonitorTipsWidget(QWidget *parent) void SystemMonitorTipsWidget::setSystemMonitorTipsText(QStringList strList) { - m_textList = strList; + m_textList = strList; // [ CPU: 100.0% ↓ 1000kb/s ] // 获取strList字符串,并存入cpu,mem,upLoad,download中 @@ -37,14 +37,14 @@ void SystemMonitorTipsWidget::setSystemMonitorTipsText(QStringList strList) else if (i == 3) upLoad = m_textList.at(i); else - qDebug() << "do not set the text"; + qCDebug(app) << "do not set the text"; } // 设置左侧字符串宽度 if (cpu.length() == 3) { - m_leftWidth = fontMetrics().width(QString(" ") + DApplication::translate("Plugin.cpu", "CPU") + QString(": 0") + cpu + QString("%") + QString(" ")); + m_leftWidth = fontMetrics().width(QString(" ") + DApplication::translate("Plugin.cpu", "CPU") + QString(": 0") + cpu + QString(" ")); } else { - m_leftWidth = fontMetrics().width(QString(" ") + DApplication::translate("Plugin.cpu", "CPU") + QString(": ") + cpu + QString("%") + QString(" ")); + m_leftWidth = fontMetrics().width(QString(" ") + DApplication::translate("Plugin.cpu", "CPU") + QString(": ") + cpu + QString(" ")); } // 左侧宽度预留20个像素 m_leftWidth += 20; @@ -62,13 +62,11 @@ void SystemMonitorTipsWidget::setSystemMonitorTipsText(QStringList strList) // 设置右侧字符串宽度预留20个像素 m_rightWidth += 20; - // 设置当前窗体固定大小 setFixedSize(5 + 5 + m_leftWidth + m_rightWidth, fontMetrics().boundingRect(m_textList.at(0)).height() * 2 + 20); update(); } - void SystemMonitorTipsWidget::paintEvent(QPaintEvent *event) { QFrame::paintEvent(event); @@ -99,7 +97,7 @@ void SystemMonitorTipsWidget::paintEvent(QPaintEvent *event) else if (i == 3) upLoad = m_textList.at(i); else - qDebug() << "do not set the text"; + qCDebug(app) << "do not set the text"; } // 当没有数据更新时,设置默认的悬浮框内容 @@ -110,7 +108,7 @@ void SystemMonitorTipsWidget::paintEvent(QPaintEvent *event) downLoad = "0KB/s"; } -// int specialCharaWidth = fontMetrics().width(QString("↓")); + // int specialCharaWidth = fontMetrics().width(QString("↓")); int specialCharaWidth = 10; int specialCharaHeight = fontMetrics().width(QString("1")) + 5; @@ -125,8 +123,7 @@ void SystemMonitorTipsWidget::paintEvent(QPaintEvent *event) painter.setPen(QPen(palette().brightText(), 1)); // 绘制CPU文字信息 - painter.drawText(QRectF(leftMargin, 0.0, m_leftWidth, rectHeight / 2.0), QString(" ") + DApplication::translate("Plugin.cpu", "CPU") + QString(": ") + cpu + QString("%"), optionLeft); - + painter.drawText(QRectF(leftMargin, 0.0, m_leftWidth, rectHeight / 2.0), QString(" ") + DApplication::translate("Plugin.cpu", "CPU") + QString(": ") + cpu, optionLeft); // 绘制下箭头 painter.save(); @@ -139,11 +136,11 @@ void SystemMonitorTipsWidget::paintEvent(QPaintEvent *event) painter.drawLines(vecDown); painter.restore(); -// painter.drawText(QRectF(m_leftWidth, 0.0, specialCharaWidth, rectHeight / 2.0), QString("↓"), optionMid); + // painter.drawText(QRectF(m_leftWidth, 0.0, specialCharaWidth, rectHeight / 2.0), QString("↓"), optionMid); // 绘值下载文字信息 painter.drawText(QRectF(leftMargin + m_leftWidth + specialCharaWidth + 5, 0, m_rightWidth, rectHeight / 2.0), downLoad, optionLeft); -// specialCharaWidth = fontMetrics().width(QString("↑")); + // specialCharaWidth = fontMetrics().width(QString("↑")); // 绘制左侧空白矩形区域 painter.save(); painter.setPen(QColor(Qt::transparent)); @@ -151,7 +148,7 @@ void SystemMonitorTipsWidget::paintEvent(QPaintEvent *event) painter.restore(); // 绘制内存文字信息 - painter.drawText(QRectF(leftMargin, rectHeight / 2.0, m_leftWidth, rectHeight / 2.0), QString(" ") + DApplication::translate("Plugin.mem", "MEM") + QString(": ") + mem + QString("%"), optionLeft); + painter.drawText(QRectF(leftMargin, rectHeight / 2.0, m_leftWidth, rectHeight / 2.0), QString(" ") + DApplication::translate("Plugin.mem", "MEM") + QString(": ") + mem, optionLeft); painter.save(); painter.setPen(QPen(palette().brightText(), 2)); painter.setRenderHints(QPainter::Antialiasing); @@ -159,10 +156,10 @@ void SystemMonitorTipsWidget::paintEvent(QPaintEvent *event) QVector vecUp; vecUp.append(QLineF(QPointF(leftMargin + m_leftWidth, rectHeight / 2.0 + rectHeight / 4.0), QPointF(leftMargin + m_leftWidth + specialCharaWidth / 2, rectHeight / 2.0 + rectHeight / 4.0 - specialCharaHeight / 2.0))); vecUp.append(QLineF(QPointF(leftMargin + m_leftWidth + specialCharaWidth / 2, rectHeight / 2.0 + rectHeight / 4.0 - specialCharaHeight / 2.0), QPointF(leftMargin + m_leftWidth + specialCharaWidth, rectHeight / 2.0 + rectHeight / 4.0))); - vecUp.append(QLineF(QPointF(leftMargin + m_leftWidth + specialCharaWidth / 2, rectHeight / 2.0 + rectHeight / 4.0 - specialCharaHeight / 2.0), QPointF(leftMargin + m_leftWidth + specialCharaWidth / 2,rectHeight / 2.0 + rectHeight / 4.0 + specialCharaHeight / 2.0))); + vecUp.append(QLineF(QPointF(leftMargin + m_leftWidth + specialCharaWidth / 2, rectHeight / 2.0 + rectHeight / 4.0 - specialCharaHeight / 2.0), QPointF(leftMargin + m_leftWidth + specialCharaWidth / 2, rectHeight / 2.0 + rectHeight / 4.0 + specialCharaHeight / 2.0))); painter.drawLines(vecUp); painter.restore(); -// painter.drawText(QRectF(m_leftWidth, rectHeight / 2.0, specialCharaWidth, rectHeight / 2.0), QString("↑"), optionMid); + // painter.drawText(QRectF(m_leftWidth, rectHeight / 2.0, specialCharaWidth, rectHeight / 2.0), QString("↑"), optionMid); // 绘制上传文字信息 painter.setPen(QPen(palette().brightText(), 1)); @@ -176,7 +173,15 @@ bool SystemMonitorTipsWidget::event(QEvent *event) if (m_textList.size() > 0) setSystemMonitorTipsText(m_textList); else - setSystemMonitorTipsText(QStringList() << "0.0" << "0.0" << "0KB/s" << "0KB/s"); + setSystemMonitorTipsText(QStringList() << "0.0" + << "0.0" + << "0KB/s" + << "0KB/s"); + } else if (event->type() == QEvent::Hide) { + Q_EMIT visibleChanged(false); + } else if (event->type() == QEvent::Show) { + Q_EMIT visibleChanged(true); } + return QFrame::event(event); } diff --git a/deepin-system-monitor-plugin/gui/systemmonitortipswidget.h b/deepin-system-monitor-plugin/gui/systemmonitortipswidget.h index 0cb65bc8..10438c59 100644 --- a/deepin-system-monitor-plugin/gui/systemmonitortipswidget.h +++ b/deepin-system-monitor-plugin/gui/systemmonitortipswidget.h @@ -9,6 +9,7 @@ #include class SystemMonitorTipsWidget : public QFrame { + Q_OBJECT public: explicit SystemMonitorTipsWidget(QWidget *parent = nullptr); @@ -18,6 +19,9 @@ class SystemMonitorTipsWidget : public QFrame //! void setSystemMonitorTipsText(QStringList strList); +Q_SIGNALS: + void visibleChanged(bool visible); + protected: //! //! \brief paintEvent 重绘系统监视器插件提示框 diff --git a/deepin-system-monitor-plugin/logger.cpp b/deepin-system-monitor-plugin/logger.cpp new file mode 100644 index 00000000..9a06baf6 --- /dev/null +++ b/deepin-system-monitor-plugin/logger.cpp @@ -0,0 +1,67 @@ +// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#include "logger.h" +#include "dtkcore_global.h" +#include "qglobal.h" +#include "ddlog.h" +#include +#include + +#include +using namespace DDLog; +DCORE_USE_NAMESPACE + +MLogger::MLogger(QObject *parent) + : QObject(parent), m_rules(""), m_config(nullptr) +{ + QByteArray logRules = qgetenv("QT_LOGGING_RULES"); + // qunsetenv 之前一定不要有任何日志打印,否则取消环境变量设置不会生效 + qunsetenv("QT_LOGGING_RULES"); + + // set env + m_rules = logRules; + + // set dconfig + m_config = DConfig::create("org.deepin.system-monitor", "org.deepin.system-monitor.plugin"); + logRules = m_config->value("log_rules").toByteArray(); + appendRules(logRules); + setRules(m_rules); + + // watch dconfig + connect(m_config, &DConfig::valueChanged, this, [this](const QString &key) { + qCCritical(app) << "value changed:" << key; + if (key == "log_rules") { + setRules(m_config->value(key).toByteArray()); + } + }); +} + +MLogger::~MLogger() +{ + m_config->deleteLater(); +} + +void MLogger::setRules(const QString &rules) +{ + auto tmpRules = rules; + m_rules = tmpRules.replace(";", "\n"); + QLoggingCategory::setFilterRules(m_rules); +} + +void MLogger::appendRules(const QString &rules) +{ + QString tmpRules = rules; + tmpRules = tmpRules.replace(";", "\n"); + auto tmplist = tmpRules.split('\n'); + for (int i = 0; i < tmplist.count(); i++) + if (m_rules.contains(tmplist.at(i))) { + tmplist.removeAt(i); + i--; + } + if (tmplist.isEmpty()) + return; + m_rules.isEmpty() ? m_rules = tmplist.join("\n") + : m_rules += "\n" + tmplist.join("\n"); +} diff --git a/deepin-system-monitor-plugin/logger.h b/deepin-system-monitor-plugin/logger.h new file mode 100644 index 00000000..946fa7a3 --- /dev/null +++ b/deepin-system-monitor-plugin/logger.h @@ -0,0 +1,28 @@ +// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#include +#include + +DCORE_BEGIN_NAMESPACE +class DConfig; +DCORE_END_NAMESPACE + +class MLogger : public QObject +{ + Q_OBJECT +public: + explicit MLogger(QObject *parent = nullptr); + ~MLogger(); + + inline QString rules() const { return m_rules; } + void setRules(const QString &rules); + +private: + void appendRules(const QString &rules); + +private: + QString m_rules; + Dtk::Core::DConfig *m_config; +}; diff --git a/deepin-system-monitor-plugin/system-monitor_20.json b/deepin-system-monitor-plugin/system-monitor_20.json new file mode 100644 index 00000000..1e8c6b55 --- /dev/null +++ b/deepin-system-monitor-plugin/system-monitor_20.json @@ -0,0 +1,3 @@ +{ + "api": "2.0.0" +} \ No newline at end of file diff --git a/deepin-system-monitor-server/CMakeLists.txt b/deepin-system-monitor-server/CMakeLists.txt index a50b9be0..51ddfc83 100644 --- a/deepin-system-monitor-server/CMakeLists.txt +++ b/deepin-system-monitor-server/CMakeLists.txt @@ -32,20 +32,24 @@ file(GLOB_RECURSE SRC_CPP ${CMAKE_CURRENT_LIST_DIR}/src/*.cpp) file(GLOB_RECURSE SRC_H ${CMAKE_CURRENT_LIST_DIR}/src/*.h) find_package(Qt5 COMPONENTS Core DBus REQUIRED) +find_package(Dtk REQUIRED COMPONENTS Core) add_executable(${BIN_NAME} ${SRC_CPP} ${SRC_H} + src ) target_include_directories(${BIN_NAME} PUBLIC Qt5::Core Qt5::DBus + Dtk::Core ) target_link_libraries(${BIN_NAME} PRIVATE Qt5::Core Qt5::DBus + Dtk::Core ) install(TARGETS ${BIN_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR}) diff --git a/deepin-system-monitor-server/src/ddlog.h b/deepin-system-monitor-server/src/ddlog.h new file mode 100644 index 00000000..9f1f5230 --- /dev/null +++ b/deepin-system-monitor-server/src/ddlog.h @@ -0,0 +1,15 @@ +// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#ifndef DDLOG_H +#define DDLOG_H +#include +#include +DCORE_USE_NAMESPACE + +namespace DDLog { +inline Q_LOGGING_CATEGORY(app, "org.deepin.system-monitor.server") +} + +#endif // DDLOG_H diff --git a/deepin-system-monitor-server/src/logger.cpp b/deepin-system-monitor-server/src/logger.cpp new file mode 100644 index 00000000..09f0f10c --- /dev/null +++ b/deepin-system-monitor-server/src/logger.cpp @@ -0,0 +1,67 @@ +// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#include "logger.h" +#include "dtkcore_global.h" +#include "qglobal.h" +#include "ddlog.h" +#include +#include + +#include +using namespace DDLog; +DCORE_USE_NAMESPACE + +MLogger::MLogger(QObject *parent) + : QObject(parent), m_rules(""), m_config(nullptr) +{ + QByteArray logRules = qgetenv("QT_LOGGING_RULES"); + // qunsetenv 之前一定不要有任何日志打印,否则取消环境变量设置不会生效 + qunsetenv("QT_LOGGING_RULES"); + + // set env + m_rules = logRules; + + // set dconfig + m_config = DConfig::create("deepin-system-monitor-server", "org.deepin.system-monitor.server"); + logRules = m_config->value("log_rules").toByteArray(); + appendRules(logRules); + setRules(m_rules); + + // watch dconfig + connect(m_config, &DConfig::valueChanged, this, [this](const QString &key) { + qCCritical(app) << "value changed:" << key; + if (key == "log_rules") { + setRules(m_config->value(key).toByteArray()); + } + }); +} + +MLogger::~MLogger() +{ + m_config->deleteLater(); +} + +void MLogger::setRules(const QString &rules) +{ + auto tmpRules = rules; + m_rules = tmpRules.replace(";", "\n"); + QLoggingCategory::setFilterRules(m_rules); +} + +void MLogger::appendRules(const QString &rules) +{ + QString tmpRules = rules; + tmpRules = tmpRules.replace(";", "\n"); + auto tmplist = tmpRules.split('\n'); + for (int i = 0; i < tmplist.count(); i++) + if (m_rules.contains(tmplist.at(i))) { + tmplist.removeAt(i); + i--; + } + if (tmplist.isEmpty()) + return; + m_rules.isEmpty() ? m_rules = tmplist.join("\n") + : m_rules += "\n" + tmplist.join("\n"); +} diff --git a/deepin-system-monitor-server/src/logger.h b/deepin-system-monitor-server/src/logger.h new file mode 100644 index 00000000..946fa7a3 --- /dev/null +++ b/deepin-system-monitor-server/src/logger.h @@ -0,0 +1,28 @@ +// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#include +#include + +DCORE_BEGIN_NAMESPACE +class DConfig; +DCORE_END_NAMESPACE + +class MLogger : public QObject +{ + Q_OBJECT +public: + explicit MLogger(QObject *parent = nullptr); + ~MLogger(); + + inline QString rules() const { return m_rules; } + void setRules(const QString &rules); + +private: + void appendRules(const QString &rules); + +private: + QString m_rules; + Dtk::Core::DConfig *m_config; +}; diff --git a/deepin-system-monitor-server/src/main.cpp b/deepin-system-monitor-server/src/main.cpp index de9fec23..c15eaf3e 100644 --- a/deepin-system-monitor-server/src/main.cpp +++ b/deepin-system-monitor-server/src/main.cpp @@ -4,11 +4,27 @@ #include #include +#include +#include +#include "dtkcore_global.h" #include "dbusserver.h" +#include "logger.h" int main(int argc, char *argv[]) { + MLogger(); // 日志处理要放在app之前,否则QApplication + // 内部可能进行了日志打印,导致环境变量设置不生效 +// 为了兼容性 +#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 8, 0)) + Dtk::Core::DLogManager::registerJournalAppender(); +#else + Dtk::Core::DLogManager::registerFileAppender(); +#endif +#ifdef QT_DEBUG + Dtk::Core::DLogManager::registerConsoleAppender(); +#endif + QCoreApplication a(argc, argv); DBusServer dbusServer; diff --git a/deepin-system-monitor-system-server/CMakeLists.txt b/deepin-system-monitor-system-server/CMakeLists.txt new file mode 100644 index 00000000..d701efd7 --- /dev/null +++ b/deepin-system-monitor-system-server/CMakeLists.txt @@ -0,0 +1,73 @@ +cmake_minimum_required(VERSION 3.7) + +set(BIN_NAME deepin-system-monitor-system-server) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(CMAKE_AUTOMOC ON) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong -D_FORTITY_SOURCE=1 -z noexecstack -pie -fPIC -z lazy") + +# 设置包含头文件的时候不用包含路径 begin **************************************************************************************** +MACRO(SUBDIRLIST result curdir) + FILE(GLOB children RELATIVE ${curdir} ${curdir}/*) + SET(dirlist "") + FOREACH(child ${children}) + IF(IS_DIRECTORY ${curdir}/${child}) + LIST(APPEND dirlist ${child}) + ENDIF() + ENDFOREACH() + SET(${result} ${dirlist}) +ENDMACRO() +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src) +SUBDIRLIST(dirs ${CMAKE_CURRENT_SOURCE_DIR}/src) +foreach(dir ${dirs}) + include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/${dir}) +endforeach() +# 设置包含头文件的时候不用包含路径 end **************************************************************************************** + +file(GLOB_RECURSE SRC_CPP ${CMAKE_CURRENT_LIST_DIR}/src/*.cpp) +file(GLOB_RECURSE SRC_H ${CMAKE_CURRENT_LIST_DIR}/src/*.h) + +find_package(Qt5 COMPONENTS Core DBus REQUIRED) +find_package(PolkitQt5-1 REQUIRED) +find_package(Dtk REQUIRED COMPONENTS Core) + +add_executable(${BIN_NAME} + ${SRC_CPP} + ${SRC_H} +) + +target_include_directories(${BIN_NAME} PUBLIC + Qt5::Core + Qt5::DBus + PolkitQt5-1::Agent + Dtk::Core +) + +target_link_libraries(${BIN_NAME} PRIVATE + Qt5::Core + Qt5::DBus + PolkitQt5-1::Agent + Dtk::Core +) + +# Use deepin-service-manager mange DBus servicde +install(TARGETS ${BIN_NAME} DESTINATION /usr/lib/deepin-daemon/) +install(FILES ./misc/${BIN_NAME}.json DESTINATION share/deepin-service-manager/other/) +# DBus service and conf +install(FILES ./misc/org.deepin.SystemMonitorSystemServer.service DESTINATION ${CMAKE_INSTALL_DATADIR}/dbus-1/system-services) +install(FILES ./misc/org.deepin.SystemMonitorSystemServer.conf DESTINATION ${CMAKE_INSTALL_DATADIR}/dbus-1/system.d) +# Systemd +install(FILES ./misc/deepin-system-monitor-system-server.service DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/systemd/system/) +# Polkit; Update translation +set(POLICY_FILE org.deepin.deepin-system-monitor-system-server.policy) +find_program(POLICY_TS_CONV deepin-policy-ts-convert REQUIRED) +add_custom_target(APP_POLICY_FILE_TEST + ALL + COMMAND ${POLICY_TS_CONV} ts2policy ${CMAKE_CURRENT_SOURCE_DIR}/misc/${POLICY_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/translations/policy/ ${POLICY_FILE}.tmp + COMMAND mv ${POLICY_FILE}.tmp ${CMAKE_CURRENT_SOURCE_DIR}/misc/${POLICY_FILE} +) +install(FILES ./misc/${POLICY_FILE} DESTINATION ${CMAKE_INSTALL_DATADIR}/polkit-1/actions) diff --git a/deepin-system-monitor-system-server/misc/deepin-system-monitor-system-server.json b/deepin-system-monitor-system-server/misc/deepin-system-monitor-system-server.json new file mode 100644 index 00000000..45ec3f8f --- /dev/null +++ b/deepin-system-monitor-system-server/misc/deepin-system-monitor-system-server.json @@ -0,0 +1,10 @@ +{ + "name": "org.deepin.SystemMonitorSystemServer", + "startType": "OnDemand", + "idleTime": 10, + "policy": [ + { + "path": "/org/deepin/SystemMonitorSystemServer" + } + ] +} \ No newline at end of file diff --git a/deepin-system-monitor-system-server/misc/deepin-system-monitor-system-server.service b/deepin-system-monitor-system-server/misc/deepin-system-monitor-system-server.service new file mode 100644 index 00000000..8432b8a6 --- /dev/null +++ b/deepin-system-monitor-system-server/misc/deepin-system-monitor-system-server.service @@ -0,0 +1,11 @@ +[Unit] +Description=Deepin system monitor system server + +[Service] +Type=dbus +BusName=com.deepin.SystemMonitorSystemServer +ExecStart=/usr/lib/deepin-daemon/deepin-system-monitor-system-server +StandardOutput=syslog +CapabilityBoundingSet=~ +MemoryLimit=1G +IOWeight=200 \ No newline at end of file diff --git a/deepin-system-monitor-system-server/misc/org.deepin.SystemMonitorSystemServer.conf b/deepin-system-monitor-system-server/misc/org.deepin.SystemMonitorSystemServer.conf new file mode 100644 index 00000000..7cc27e0d --- /dev/null +++ b/deepin-system-monitor-system-server/misc/org.deepin.SystemMonitorSystemServer.conf @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/deepin-system-monitor-system-server/misc/org.deepin.SystemMonitorSystemServer.service b/deepin-system-monitor-system-server/misc/org.deepin.SystemMonitorSystemServer.service new file mode 100644 index 00000000..d92dc9ab --- /dev/null +++ b/deepin-system-monitor-system-server/misc/org.deepin.SystemMonitorSystemServer.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.deepin.SystemMonitorSystemServer +Exec=/usr/bin/false +SystemdService=deepin-system-monitor-system-server.service diff --git a/deepin-system-monitor-system-server/misc/org.deepin.deepin-system-monitor-system-server.policy b/deepin-system-monitor-system-server/misc/org.deepin.deepin-system-monitor-system-server.policy new file mode 100644 index 00000000..9b16fa6a --- /dev/null +++ b/deepin-system-monitor-system-server/misc/org.deepin.deepin-system-monitor-system-server.policy @@ -0,0 +1,78 @@ + + + + LinuxDeepin + https://www.deepin.com/ + + Set service startup type + Authentication is required to set service startup type + + no + no + auth_admin_keep + + /usr/bin/deepin-system-monitor + true + Hizmet başlangıç ​​türünü ayarla + Hizmet başlangıç ​​türünü ayarlamak için kimlik doğrulaması gerekli + Definir o tipo de arranque do serviço + É necessária a autenticação para definir o tipo de arranque do serviço + Tetapkan jenis permulaan perkhidmatan + Pengesahihan diperlukan untuk menetapkan jenis permulaan perkhidmatan + Indstil tjenestens opstartstype + Der kræves autentifikation for at indstille tjenestens opstartstype + تعيين نوع بدء تشغيل الخدمة + المصادقة مطلوبة لتعيين نوع بدء تشغيل الخدمة + Definir o tipo de inicialização do serviço + A autenticação é necessária para definir o tipo de inicialização do serviço + Termeniñ doare loc'hañ ar servij + An anaoudadur a zo rekis evit termeniñ an doare loc'hañ servij + Nastavit typ spouštění služby + Pro nastavení typu spouštění služby je třeba ověření se + Setel tipe layanan startup + Autentikasi diperlukan untuk menyetel tipe layanan startup + Estableza o tipo de inicio de servizo + A autenticación é necesaria para configurar o tipo de inicio de servizo + Dienst-Starttyp einstellen + Authentifizierung ist erforderlich, um den Starttyp des Dienstes einzustellen + Palvelun käynnistystyypin vaihto + Palvelun käynnistystyypin vaihtamiseen vaaditaan todennus + 서비스 시작 유형 설정 + 서비스 시작 유형을 설정하려면 인증이 필요합니다. + 設定服務的啟動方式 + 設定服務的啟動方式需要認證 + 設置服務的啟動方式 + 設置服務的啟動方式需要認證 + Állítsa be a szolgáltatás indítási típusát + Hitelesítés szükséges a szolgáltatás indítási típusának beállításához + Ustaw typ uruchomienia usługi + Wymagane jest uwierzytelnienie, aby ustawić typ uruchamiania usługi + مۇلازىمەت باشلاش تىپىنى بەلگىلەش + مۇلازىمەت باشلاش تىپىنى تەڭشەش ئۈچۈن دەلىللەش تەلەپ قىلىنىدۇ + Xidmətin başladılma növünü təyin edin + Xidmətin başladılma növünü təyin etmək üçün doğrulama tələb olunur + Постави режим покретања услуге + Идентификација је неопходна за поставку режима покретања услуга + Establecer tipo de inicio del servicio + Se requiere autenticación para establecer el tipo de servicio de inicio + Définir le type de démarrage du service + L'authentification est requise pour définir le type de démarrage du service + Imposta tipo di avvio del servizio + Autenticazione richiesta per variare il tipo di avvio automatico + Soort opstart instellen + Voer je wachtwoord in om het soort opstart in te stellen + 设置服务的启动方式 + 设置服务的启动方式需要认证 + ཞབས་ཞུའི་འགོ་སློང་བྱེད་ཐབས་སྒྲིག་འགོད་བྱེད་པ། + ཞབས་ཞུའི་འགོ་སློང་ཐབས་སྒྲིག་འགོད་བྱེད་པར་དཔང་དཔྱད་བྱ་དགོས། + Встановлення типу запуску служби + Для встановлення типу запуску служби слід пройти розпізнавання + Задать тип запуска службы + Требуется аутентификация для установки типа запуска службы + Caktoni lloj nisjeje shërbimi + Që të caktohet lloj nisjeje shërbimi, lyspet mirëfilltësim + Establiu el tipus d'inici del servei + Cal autenticació per establir el tipus d'inici del servei. + + diff --git a/deepin-system-monitor-system-server/src/ddlog.h b/deepin-system-monitor-system-server/src/ddlog.h new file mode 100644 index 00000000..9f1f5230 --- /dev/null +++ b/deepin-system-monitor-system-server/src/ddlog.h @@ -0,0 +1,15 @@ +// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#ifndef DDLOG_H +#define DDLOG_H +#include +#include +DCORE_USE_NAMESPACE + +namespace DDLog { +inline Q_LOGGING_CATEGORY(app, "org.deepin.system-monitor.server") +} + +#endif // DDLOG_H diff --git a/deepin-system-monitor-system-server/src/logger.cpp b/deepin-system-monitor-system-server/src/logger.cpp new file mode 100644 index 00000000..09f0f10c --- /dev/null +++ b/deepin-system-monitor-system-server/src/logger.cpp @@ -0,0 +1,67 @@ +// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#include "logger.h" +#include "dtkcore_global.h" +#include "qglobal.h" +#include "ddlog.h" +#include +#include + +#include +using namespace DDLog; +DCORE_USE_NAMESPACE + +MLogger::MLogger(QObject *parent) + : QObject(parent), m_rules(""), m_config(nullptr) +{ + QByteArray logRules = qgetenv("QT_LOGGING_RULES"); + // qunsetenv 之前一定不要有任何日志打印,否则取消环境变量设置不会生效 + qunsetenv("QT_LOGGING_RULES"); + + // set env + m_rules = logRules; + + // set dconfig + m_config = DConfig::create("deepin-system-monitor-server", "org.deepin.system-monitor.server"); + logRules = m_config->value("log_rules").toByteArray(); + appendRules(logRules); + setRules(m_rules); + + // watch dconfig + connect(m_config, &DConfig::valueChanged, this, [this](const QString &key) { + qCCritical(app) << "value changed:" << key; + if (key == "log_rules") { + setRules(m_config->value(key).toByteArray()); + } + }); +} + +MLogger::~MLogger() +{ + m_config->deleteLater(); +} + +void MLogger::setRules(const QString &rules) +{ + auto tmpRules = rules; + m_rules = tmpRules.replace(";", "\n"); + QLoggingCategory::setFilterRules(m_rules); +} + +void MLogger::appendRules(const QString &rules) +{ + QString tmpRules = rules; + tmpRules = tmpRules.replace(";", "\n"); + auto tmplist = tmpRules.split('\n'); + for (int i = 0; i < tmplist.count(); i++) + if (m_rules.contains(tmplist.at(i))) { + tmplist.removeAt(i); + i--; + } + if (tmplist.isEmpty()) + return; + m_rules.isEmpty() ? m_rules = tmplist.join("\n") + : m_rules += "\n" + tmplist.join("\n"); +} diff --git a/deepin-system-monitor-system-server/src/logger.h b/deepin-system-monitor-system-server/src/logger.h new file mode 100644 index 00000000..946fa7a3 --- /dev/null +++ b/deepin-system-monitor-system-server/src/logger.h @@ -0,0 +1,28 @@ +// Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later +#include +#include + +DCORE_BEGIN_NAMESPACE +class DConfig; +DCORE_END_NAMESPACE + +class MLogger : public QObject +{ + Q_OBJECT +public: + explicit MLogger(QObject *parent = nullptr); + ~MLogger(); + + inline QString rules() const { return m_rules; } + void setRules(const QString &rules); + +private: + void appendRules(const QString &rules); + +private: + QString m_rules; + Dtk::Core::DConfig *m_config; +}; diff --git a/deepin-system-monitor-system-server/src/main.cpp b/deepin-system-monitor-system-server/src/main.cpp new file mode 100644 index 00000000..83e02014 --- /dev/null +++ b/deepin-system-monitor-system-server/src/main.cpp @@ -0,0 +1,17 @@ +// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include + +#include "systemdbusserver.h" + +int main(int argc, char *argv[]) +{ + QCoreApplication a(argc, argv); + + SystemDBusServer dbusServer; + dbusServer.exitDBusServer(10000); + + return a.exec(); +} diff --git a/deepin-system-monitor-system-server/src/systemdbusserver.cpp b/deepin-system-monitor-system-server/src/systemdbusserver.cpp new file mode 100644 index 00000000..617ac36e --- /dev/null +++ b/deepin-system-monitor-system-server/src/systemdbusserver.cpp @@ -0,0 +1,182 @@ +// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "systemdbusserver.h" +#include "ddlog.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +using namespace DDLog; + +const QString s_PolkitActionSet = "org.deepin.systemmonitor.systemserver.set"; + +/** + @brief polkit 鉴权,通过配置文件处理 + */ +bool checkAuthorization(qint64 pid, const QString &action) +{ + PolkitQt1::Authority::Result ret = PolkitQt1::Authority::instance()->checkAuthorizationSync( + action, PolkitQt1::UnixProcessSubject(pid), PolkitQt1::Authority::AllowUserInteraction); + if (PolkitQt1::Authority::Yes == ret) { + return true; + } else { + qWarning() << qPrintable("Policy authorization check failed!"); + return false; + } +} + +/** + @return 返回PID对应的可执行程序名称 + */ +static QString getProcIdExe(qint64 id) +{ + QString execName; + if (id > 0) { + // Read contents of virtual /proc/{pid}/cmdline file + QString exeSymlinkPath = QString("/proc/%1/exe").arg(id); + char *actualpath = realpath(exeSymlinkPath.toStdString().c_str(), nullptr); + execName = QString(actualpath); + } + return execName; +} + +SystemDBusServer::SystemDBusServer(QObject *parent) + : QObject(parent) +{ + // name: 配置文件中的服务名称 org.deepin.SystemMonitorSystemServer + QDBusConnection dbus = QDBusConnection::systemBus(); + if (dbus.registerService("org.deepin.SystemMonitorSystemServer")) { + QDBusConnection::RegisterOptions opts = + QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals | QDBusConnection::ExportAllProperties; + if (!dbus.registerObject("/org/deepin/SystemMonitorSystemServer", this, opts)) { + qWarning() << qPrintable("Register dbus object failed") << dbus.lastError().message(); + } + } else { + qWarning() << qPrintable("Register dbus failed") << dbus.lastError().message(); + } + m_timer.setSingleShot(true); + connect(&m_timer, &QTimer::timeout, this, [=]() { qApp->exit(0); }); +} + +/** + @brief 延时退出执行服务 + */ +void SystemDBusServer::exitDBusServer(int msec) +{ + qApp->processEvents(); + m_timer.start(msec); +} + +/** + @brief 设置 systemctl 服务 \a serviceName 的启动方式为 \b enable ,仅用于非开发者模式 + */ +QString SystemDBusServer::setServiceEnable(const QString &serviceName, bool enable) +{ + QString ret = setServiceEnableImpl(serviceName, enable); + exitDBusServer(8000); + return ret; +} + +/** + @brief 执行设置 systemctl 服务 \a serviceName 启动方式 \a enable ,将返回详细处理结果 + */ +QString SystemDBusServer::setServiceEnableImpl(const QString &serviceName, bool enable) +{ + // 调用者限制前台系统监视器程序 + if (!checkCaller()) { + qWarning() << qPrintable("Caller not authorized"); + return QString(strerror(EPERM)); + } + + // 不允许包含';' ' '字符,服务名称长度同样限制 + if (serviceName.isEmpty() || (serviceName.size() > SHRT_MAX) || serviceName.contains(QRegExp("[; ]"))) { + qWarning() << qPrintable("Invalid service name"); + return QString(strerror(EINVAL)); + } + + // 判断服务是否存在 + QProcess listPorcess; + listPorcess.start("systemctl", { "list-unit-files", "--type=service", "--no-pager" }); + listPorcess.waitForFinished(); + QByteArray serviceList = listPorcess.readAll(); + if (!serviceList.contains(serviceName.toUtf8())) { + qWarning() << qPrintable("Service not exists"); + return QString(strerror(EINVAL)); + } + + // 鉴权处理 + if (!checkAuthorization(dbusCallerPid(), s_PolkitActionSet)) { + qWarning() << qPrintable("Polkit authorization failed"); + return QString(strerror(EPERM)); + } + + // 执行设置 + QProcess process; + process.start("systemctl", { enable ? "enable" : "disable", serviceName }); + process.waitForFinished(); + QString errorRet = process.readAll(); + + // 检测是否执行成功 + process.start("systemctl", { "is-enabled", serviceName }); + process.waitForFinished(); + QString checkRet = process.readAll(); + if (enable && ("enabled" == checkRet)) { + return {}; + } else if (!enable && ("disabled" == checkRet)) { + return {}; + } + + // 返回命令执行结果 + return errorRet; +} + +/** + @return DBus 调用者的PID + */ +qint64 SystemDBusServer::dbusCallerPid() const +{ + if (!calledFromDBus()) { + return 0; + } + + auto interface = connection().interface(); + if (interface) { + return static_cast(interface->servicePid(message().service()).value()); + } + + return 0; +} + +/** + @return 返回调用者是否为前台的系统监视器程序 + */ +bool SystemDBusServer::checkCaller() const +{ + if (!calledFromDBus()) { + return false; + } + + qint64 callerPid = dbusCallerPid(); + QString callerExe = getProcIdExe(callerPid); + QString dbmExe = QStandardPaths::findExecutable("deepin-system-monitor", { "/usr/bin" }); + + qCDebug(app) << qPrintable("callerPid is: ") << callerPid << qPrintable("callerExe is:") << callerExe; + if (callerExe != dbmExe) { + qCDebug(app) << qPrintable("caller not authorized"); + return false; + } + + qCDebug(app) << qPrintable("caller authorized"); + return true; +} diff --git a/deepin-system-monitor-system-server/src/systemdbusserver.h b/deepin-system-monitor-system-server/src/systemdbusserver.h new file mode 100644 index 00000000..f36f74ac --- /dev/null +++ b/deepin-system-monitor-system-server/src/systemdbusserver.h @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef DBUSALARMNOTIFY_H +#define DBUSALARMNOTIFY_H + +#include +#include +#include + +class SystemDBusServer : public QObject, protected QDBusContext +{ + Q_OBJECT + Q_CLASSINFO("D-Bus Interface", "org.deepin.SystemMonitorSystemServer") + +public: + SystemDBusServer(QObject *parent = nullptr); + ~SystemDBusServer() override {} + + void exitDBusServer(int msec); + +public Q_SLOTS: + QString setServiceEnable(const QString &serviceName, bool enable); + +private: + QString setServiceEnableImpl(const QString &serviceName, bool enable); + qint64 dbusCallerPid() const; + bool checkCaller() const; + +private: + QTimer m_timer; +}; + +#endif // DBUS_OBJECT_H diff --git a/deepin-system-monitor-system-server/translations/policy/policy.ts b/deepin-system-monitor-system-server/translations/policy/policy.ts new file mode 100644 index 00000000..d1b77e74 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy.ts @@ -0,0 +1,17 @@ + + + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ady.ts b/deepin-system-monitor-system-server/translations/policy/policy_ady.ts new file mode 100644 index 00000000..20d859c8 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ady.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_am_ET.ts b/deepin-system-monitor-system-server/translations/policy/policy_am_ET.ts new file mode 100644 index 00000000..a6dfdafa --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_am_ET.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ar.ts b/deepin-system-monitor-system-server/translations/policy/policy_ar.ts new file mode 100644 index 00000000..e94b29f0 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ar.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + المصادقة مطلوبة لتعيين نوع بدء تشغيل الخدمة + + + + Set service startup type + تعيين نوع بدء تشغيل الخدمة + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ast.ts b/deepin-system-monitor-system-server/translations/policy/policy_ast.ts new file mode 100644 index 00000000..e6247130 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ast.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_az.ts b/deepin-system-monitor-system-server/translations/policy/policy_az.ts new file mode 100644 index 00000000..462d7d9c --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_az.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Xidmətin başladılma növünü təyin etmək üçün doğrulama tələb olunur + + + + Set service startup type + Xidmətin başladılma növünü təyin edin + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_bg.ts b/deepin-system-monitor-system-server/translations/policy/policy_bg.ts new file mode 100644 index 00000000..c1daadde --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_bg.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_bn.ts b/deepin-system-monitor-system-server/translations/policy/policy_bn.ts new file mode 100644 index 00000000..28e1dc88 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_bn.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_bo.ts b/deepin-system-monitor-system-server/translations/policy/policy_bo.ts new file mode 100644 index 00000000..27ad170d --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_bo.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + ཞབས་ཞུའི་འགོ་སློང་ཐབས་སྒྲིག་འགོད་བྱེད་པར་དཔང་དཔྱད་བྱ་དགོས། + + + + Set service startup type + ཞབས་ཞུའི་འགོ་སློང་བྱེད་ཐབས་སྒྲིག་འགོད་བྱེད་པ། + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_bqi.ts b/deepin-system-monitor-system-server/translations/policy/policy_bqi.ts new file mode 100644 index 00000000..6a7a789f --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_bqi.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_br.ts b/deepin-system-monitor-system-server/translations/policy/policy_br.ts new file mode 100644 index 00000000..bbe9c39e --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_br.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + An anaoudadur a zo rekis evit termeniñ an doare loc'hañ servij + + + + Set service startup type + Termeniñ doare loc'hañ ar servij + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ca.ts b/deepin-system-monitor-system-server/translations/policy/policy_ca.ts new file mode 100644 index 00000000..8d4b78d7 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ca.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Cal autenticació per establir el tipus d'inici del servei. + + + + Set service startup type + Establiu el tipus d'inici del servei + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_cs.ts b/deepin-system-monitor-system-server/translations/policy/policy_cs.ts new file mode 100644 index 00000000..ffe08fca --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_cs.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Pro nastavení typu spouštění služby je třeba ověření se + + + + Set service startup type + Nastavit typ spouštění služby + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_da.ts b/deepin-system-monitor-system-server/translations/policy/policy_da.ts new file mode 100644 index 00000000..5200dc7f --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_da.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Der kræves autentifikation for at indstille tjenestens opstartstype + + + + Set service startup type + Indstil tjenestens opstartstype + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_de.ts b/deepin-system-monitor-system-server/translations/policy/policy_de.ts new file mode 100644 index 00000000..abb78282 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_de.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Authentifizierung ist erforderlich, um den Starttyp des Dienstes einzustellen + + + + Set service startup type + Dienst-Starttyp einstellen + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_el.ts b/deepin-system-monitor-system-server/translations/policy/policy_el.ts new file mode 100644 index 00000000..f46217b4 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_el.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_en_AU.ts b/deepin-system-monitor-system-server/translations/policy/policy_en_AU.ts new file mode 100644 index 00000000..4c43556e --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_en_AU.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_eo.ts b/deepin-system-monitor-system-server/translations/policy/policy_eo.ts new file mode 100644 index 00000000..d9f3cd3d --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_eo.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_es.ts b/deepin-system-monitor-system-server/translations/policy/policy_es.ts new file mode 100644 index 00000000..cf770743 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_es.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Se requiere autenticación para establecer el tipo de servicio de inicio + + + + Set service startup type + Establecer tipo de inicio del servicio + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_et.ts b/deepin-system-monitor-system-server/translations/policy/policy_et.ts new file mode 100644 index 00000000..4b0af7f1 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_et.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_fa.ts b/deepin-system-monitor-system-server/translations/policy/policy_fa.ts new file mode 100644 index 00000000..d42fa8d5 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_fa.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_fi.ts b/deepin-system-monitor-system-server/translations/policy/policy_fi.ts new file mode 100644 index 00000000..b66ec106 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_fi.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Palvelun käynnistystyypin vaihtamiseen vaaditaan todennus + + + + Set service startup type + Palvelun käynnistystyypin vaihto + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_fil.ts b/deepin-system-monitor-system-server/translations/policy/policy_fil.ts new file mode 100644 index 00000000..cf408915 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_fil.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_fr.ts b/deepin-system-monitor-system-server/translations/policy/policy_fr.ts new file mode 100644 index 00000000..67b3b896 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_fr.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + L'authentification est requise pour définir le type de démarrage du service + + + + Set service startup type + Définir le type de démarrage du service + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_gl_ES.ts b/deepin-system-monitor-system-server/translations/policy/policy_gl_ES.ts new file mode 100644 index 00000000..0d00d8f1 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_gl_ES.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + A autenticación é necesaria para configurar o tipo de inicio de servizo + + + + Set service startup type + Estableza o tipo de inicio de servizo + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_he.ts b/deepin-system-monitor-system-server/translations/policy/policy_he.ts new file mode 100644 index 00000000..163d3a68 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_he.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_hi_IN.ts b/deepin-system-monitor-system-server/translations/policy/policy_hi_IN.ts new file mode 100644 index 00000000..ad25cd88 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_hi_IN.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_hr.ts b/deepin-system-monitor-system-server/translations/policy/policy_hr.ts new file mode 100644 index 00000000..50803ede --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_hr.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_hu.ts b/deepin-system-monitor-system-server/translations/policy/policy_hu.ts new file mode 100644 index 00000000..8206b297 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_hu.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Hitelesítés szükséges a szolgáltatás indítási típusának beállításához + + + + Set service startup type + Állítsa be a szolgáltatás indítási típusát + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_hy.ts b/deepin-system-monitor-system-server/translations/policy/policy_hy.ts new file mode 100644 index 00000000..14ed6e46 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_hy.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_id.ts b/deepin-system-monitor-system-server/translations/policy/policy_id.ts new file mode 100644 index 00000000..82bd01e3 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_id.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Autentikasi diperlukan untuk menyetel tipe layanan startup + + + + Set service startup type + Setel tipe layanan startup + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_it.ts b/deepin-system-monitor-system-server/translations/policy/policy_it.ts new file mode 100644 index 00000000..077b2d95 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_it.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Autenticazione richiesta per variare il tipo di avvio automatico + + + + Set service startup type + Imposta tipo di avvio del servizio + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ja.ts b/deepin-system-monitor-system-server/translations/policy/policy_ja.ts new file mode 100644 index 00000000..35be9295 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ja.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ka.ts b/deepin-system-monitor-system-server/translations/policy/policy_ka.ts new file mode 100644 index 00000000..901d2548 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ka.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_km_KH.ts b/deepin-system-monitor-system-server/translations/policy/policy_km_KH.ts new file mode 100644 index 00000000..9b98a818 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_km_KH.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_kn_IN.ts b/deepin-system-monitor-system-server/translations/policy/policy_kn_IN.ts new file mode 100644 index 00000000..d3f5d4ba --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_kn_IN.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ko.ts b/deepin-system-monitor-system-server/translations/policy/policy_ko.ts new file mode 100644 index 00000000..7ef31cd2 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ko.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + 서비스 시작 유형을 설정하려면 인증이 필요합니다. + + + + Set service startup type + 서비스 시작 유형 설정 + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ku.ts b/deepin-system-monitor-system-server/translations/policy/policy_ku.ts new file mode 100644 index 00000000..e7c5f100 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ku.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ku_IQ.ts b/deepin-system-monitor-system-server/translations/policy/policy_ku_IQ.ts new file mode 100644 index 00000000..9e0be9a8 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ku_IQ.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ky.ts b/deepin-system-monitor-system-server/translations/policy/policy_ky.ts new file mode 100644 index 00000000..f5206484 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ky.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ky@Arab.ts b/deepin-system-monitor-system-server/translations/policy/policy_ky@Arab.ts new file mode 100644 index 00000000..3c2d2823 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ky@Arab.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_lt.ts b/deepin-system-monitor-system-server/translations/policy/policy_lt.ts new file mode 100644 index 00000000..18b453d0 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_lt.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ml.ts b/deepin-system-monitor-system-server/translations/policy/policy_ml.ts new file mode 100644 index 00000000..c27c600a --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ml.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_mn.ts b/deepin-system-monitor-system-server/translations/policy/policy_mn.ts new file mode 100644 index 00000000..ff8ef2b6 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_mn.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_mr.ts b/deepin-system-monitor-system-server/translations/policy/policy_mr.ts new file mode 100644 index 00000000..5a945420 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_mr.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ms.ts b/deepin-system-monitor-system-server/translations/policy/policy_ms.ts new file mode 100644 index 00000000..d6d33812 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ms.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Pengesahihan diperlukan untuk menetapkan jenis permulaan perkhidmatan + + + + Set service startup type + Tetapkan jenis permulaan perkhidmatan + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_nb.ts b/deepin-system-monitor-system-server/translations/policy/policy_nb.ts new file mode 100644 index 00000000..ce31d485 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_nb.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ne.ts b/deepin-system-monitor-system-server/translations/policy/policy_ne.ts new file mode 100644 index 00000000..ec7acab2 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ne.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_nl.ts b/deepin-system-monitor-system-server/translations/policy/policy_nl.ts new file mode 100644 index 00000000..aa60d355 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_nl.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Voer je wachtwoord in om het soort opstart in te stellen + + + + Set service startup type + Soort opstart instellen + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_pa.ts b/deepin-system-monitor-system-server/translations/policy/policy_pa.ts new file mode 100644 index 00000000..a0292090 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_pa.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_pam.ts b/deepin-system-monitor-system-server/translations/policy/policy_pam.ts new file mode 100644 index 00000000..d7406d84 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_pam.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_pl.ts b/deepin-system-monitor-system-server/translations/policy/policy_pl.ts new file mode 100644 index 00000000..0301d06e --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_pl.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Wymagane jest uwierzytelnienie, aby ustawić typ uruchamiania usługi + + + + Set service startup type + Ustaw typ uruchomienia usługi + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_pt.ts b/deepin-system-monitor-system-server/translations/policy/policy_pt.ts new file mode 100644 index 00000000..32b31cd3 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_pt.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + É necessária a autenticação para definir o tipo de arranque do serviço + + + + Set service startup type + Definir o tipo de arranque do serviço + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_pt_BR.ts b/deepin-system-monitor-system-server/translations/policy/policy_pt_BR.ts new file mode 100644 index 00000000..494afbfd --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_pt_BR.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + A autenticação é necessária para definir o tipo de inicialização do serviço + + + + Set service startup type + Definir o tipo de inicialização do serviço + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ro.ts b/deepin-system-monitor-system-server/translations/policy/policy_ro.ts new file mode 100644 index 00000000..ab6d2b86 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ro.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ru.ts b/deepin-system-monitor-system-server/translations/policy/policy_ru.ts new file mode 100644 index 00000000..9a89a709 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ru.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Требуется аутентификация для установки типа запуска службы + + + + Set service startup type + Задать тип запуска службы + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_sc.ts b/deepin-system-monitor-system-server/translations/policy/policy_sc.ts new file mode 100644 index 00000000..69fa81a0 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_sc.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_si.ts b/deepin-system-monitor-system-server/translations/policy/policy_si.ts new file mode 100644 index 00000000..4d2d61a5 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_si.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_sk.ts b/deepin-system-monitor-system-server/translations/policy/policy_sk.ts new file mode 100644 index 00000000..5d684d7a --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_sk.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_sl.ts b/deepin-system-monitor-system-server/translations/policy/policy_sl.ts new file mode 100644 index 00000000..2ad88a94 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_sl.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_sq.ts b/deepin-system-monitor-system-server/translations/policy/policy_sq.ts new file mode 100644 index 00000000..7ea60a50 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_sq.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Që të caktohet lloj nisjeje shërbimi, lyspet mirëfilltësim + + + + Set service startup type + Caktoni lloj nisjeje shërbimi + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_sr.ts b/deepin-system-monitor-system-server/translations/policy/policy_sr.ts new file mode 100644 index 00000000..96404d8b --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_sr.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Идентификација је неопходна за поставку режима покретања услуга + + + + Set service startup type + Постави режим покретања услуге + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_sv.ts b/deepin-system-monitor-system-server/translations/policy/policy_sv.ts new file mode 100644 index 00000000..19bea9b2 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_sv.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_sw.ts b/deepin-system-monitor-system-server/translations/policy/policy_sw.ts new file mode 100644 index 00000000..f11f29f5 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_sw.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ta.ts b/deepin-system-monitor-system-server/translations/policy/policy_ta.ts new file mode 100644 index 00000000..3f366fbd --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ta.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_th.ts b/deepin-system-monitor-system-server/translations/policy/policy_th.ts new file mode 100644 index 00000000..a860561a --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_th.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_tr.ts b/deepin-system-monitor-system-server/translations/policy/policy_tr.ts new file mode 100644 index 00000000..809065ec --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_tr.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Hizmet başlangıç ​​türünü ayarlamak için kimlik doğrulaması gerekli + + + + Set service startup type + Hizmet başlangıç ​​türünü ayarla + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ug.ts b/deepin-system-monitor-system-server/translations/policy/policy_ug.ts new file mode 100644 index 00000000..de8229d6 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ug.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + مۇلازىمەت باشلاش تىپىنى تەڭشەش ئۈچۈن دەلىللەش تەلەپ قىلىنىدۇ + + + + Set service startup type + مۇلازىمەت باشلاش تىپىنى بەلگىلەش + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_uk.ts b/deepin-system-monitor-system-server/translations/policy/policy_uk.ts new file mode 100644 index 00000000..e293b866 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_uk.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + Для встановлення типу запуску служби слід пройти розпізнавання + + + + Set service startup type + Встановлення типу запуску служби + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_ur.ts b/deepin-system-monitor-system-server/translations/policy/policy_ur.ts new file mode 100644 index 00000000..b7dd917b --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_ur.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_vi.ts b/deepin-system-monitor-system-server/translations/policy/policy_vi.ts new file mode 100644 index 00000000..d03fc2ff --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_vi.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + + + + + Set service startup type + + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_zh_CN.ts b/deepin-system-monitor-system-server/translations/policy/policy_zh_CN.ts new file mode 100644 index 00000000..bec12aaf --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_zh_CN.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + 设置服务的启动方式需要认证 + + + + Set service startup type + 设置服务的启动方式 + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_zh_HK.ts b/deepin-system-monitor-system-server/translations/policy/policy_zh_HK.ts new file mode 100644 index 00000000..0be97222 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_zh_HK.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + 設置服務的啟動方式需要認證 + + + + Set service startup type + 設置服務的啟動方式 + + + \ No newline at end of file diff --git a/deepin-system-monitor-system-server/translations/policy/policy_zh_TW.ts b/deepin-system-monitor-system-server/translations/policy/policy_zh_TW.ts new file mode 100644 index 00000000..299d5295 --- /dev/null +++ b/deepin-system-monitor-system-server/translations/policy/policy_zh_TW.ts @@ -0,0 +1,15 @@ + + + policy + + + Authentication is required to set service startup type + 設定服務的啟動方式需要認證 + + + + Set service startup type + 設定服務的啟動方式 + + + \ No newline at end of file diff --git a/helper.hpp b/helper.hpp new file mode 100644 index 00000000..7e853800 --- /dev/null +++ b/helper.hpp @@ -0,0 +1,163 @@ +// Copyright (C) 2023 Uniontech Software Technology Co.,Ltd +// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include + +namespace common{ + +class SystemState { +public: + QString AppearanceService; + QString AppearancePath ; + QString AppearanceInterface; + QString ControlCenterService; + QString ControlCenterPath; + QString ControlCenterInterface; + + QString AccountsService; + QString AccountsPath; + QString AccountsInterface; + QString UserInterface; + + QString TrayManagerService; + QString TrayManagerPath; + QString TrayManagerInterface; + + QString DockService; + QString DockPath; + QString DockInterface; + + QString NotificationService; + QString NotificationPath; + QString NotificationInterface; + + QString MONITOR_SERVICE; + + QString DISPLAY_SERVICE; + QString DISPLAY_PATH; + QString DISPLAY_INTERFACE; + QString DISPLAYMONITOR_INTERFACE; + + QString DOCK_SERVICE; + QString DOCK_PATH; + QString DOCK_INTERFACE; + + inline bool isOldVersion() const + { + return m_isOldVersion; + } + inline void updateVersion(const bool isOld) + { + m_isOldVersion = isOld; + } +private: + bool m_isOldVersion = false; +}; + +class V23SystemState : public SystemState +{ +public: + V23SystemState() { + AppearanceService = "org.deepin.dde.Appearance1"; + AppearancePath = "/org/deepin/dde/Appearance1"; + AppearanceInterface = "org.deepin.dde.Appearance1"; + + ControlCenterService = "org.deepin.dde.ControlCenter1"; + ControlCenterPath = "/org/deepin/dde/ControlCenter1"; + ControlCenterInterface = "org.deepin.dde.ControlCenter1"; + + AccountsService = "org.deepin.dde.Accounts1"; + AccountsPath = "/org/deepin/dde/Accounts1"; + AccountsInterface = "org.deepin.dde.Accounts1"; + UserInterface = "org.deepin.dde.Accounts1.User"; + + TrayManagerService = "org.deepin.dde.TrayManager1"; + TrayManagerPath = "/org/deepin/dde/TrayManager1"; + TrayManagerInterface = "org.freedesktop.DBus.Properties"; + + DockService = "org.deepin.dde.Dock1"; + DockPath = "/org/deepin/dde/Dock1"; + DockInterface = "org.freedesktop.DBus.Properties"; + + NotificationService = "org.deepin.dde.Notification1"; + NotificationPath = "/org/deepin/dde/Notification1"; + NotificationInterface = "org.deepin.dde.Notification1"; + + MONITOR_SERVICE = "org.deepin.dde.XEventMonitor1"; + + DISPLAY_SERVICE = "org.deepin.dde.Display1"; + DISPLAY_PATH = "/org/deepin/dde/Display1"; + DISPLAY_INTERFACE = "org.deepin.dde.Display1"; + DISPLAYMONITOR_INTERFACE = "org.deepin.dde.Display1.Monitor"; + + DOCK_SERVICE = "org.deepin.dde.daemon.Dock1"; + DOCK_PATH = "/org/deepin/dde/daemon/Dock1"; + DOCK_INTERFACE = "org.deepin.dde.daemon.Dock1"; + } +}; + +class V20SystemState : public SystemState +{ +public: + V20SystemState() { + AppearanceService = "com.deepin.daemon.Appearance"; + AppearancePath = "/com/deepin/daemon/Appearance"; + AppearanceInterface = "com.deepin.daemon.Appearance"; + + ControlCenterService = "com.deepin.dde.ControlCenter"; + ControlCenterPath = "/com/deepin/dde/ControlCenter"; + ControlCenterInterface = "com.deepin.dde.ControlCenter"; + + AccountsService = "com.deepin.daemon.Accounts"; + AccountsPath = "/com/deepin/daemon/Accounts"; + AccountsInterface = "com.deepin.daemon.Accounts"; + UserInterface = "com.deepin.daemon.Accounts.User"; + + TrayManagerService = "com.deepin.dde.TrayManager"; + TrayManagerPath = "/com/deepin/dde/TrayManager"; + TrayManagerInterface = "org.freedesktop.DBus.Properties"; + + DockService = "com.deepin.dde.Dock"; + DockPath = "/com/deepin/dde/Dock"; + DockInterface = "org.freedesktop.DBus.Properties"; + + NotificationService = "com.deepin.dde.Notification"; + NotificationPath = "/com/deepin/dde/Notification"; + NotificationInterface = "com.deepin.dde.Notification"; + + MONITOR_SERVICE = "com.deepin.api.XEventMonitor"; + + DISPLAY_SERVICE = "com.deepin.daemon.Display"; + DISPLAY_PATH = "/com/deepin/daemon/Display"; + DISPLAY_INTERFACE = "com.deepin.daemon.Display"; + DISPLAYMONITOR_INTERFACE = "com.deepin.daemon.Display.Monitor"; + + DOCK_SERVICE = "com.deepin.dde.daemon.Dock"; + DOCK_PATH = "/com/deepin/dde/daemon/Dock"; + DOCK_INTERFACE = "com.deepin.dde.daemon.Dock"; + } +}; + +static inline const SystemState &systemInfo() +{ + static SystemState *state = nullptr; + if (!state) { + const auto version = DTK_CORE_NAMESPACE::DSysInfo::majorVersion(); + qInfo() << "Running desktop environment version is:" << version << ", versionNumber:" << version.toLong(); + if (!version.isEmpty() && version.toLong() <= 20) { + state = new V20SystemState(); + state->updateVersion(true); + } else { + state = new V23SystemState(); + state->updateVersion(false); + } + } + return *state; +} + +} \ No newline at end of file diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 94695962..cbcaed69 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -70,7 +70,6 @@ find_package(DtkCore REQUIRED) find_package(DtkGui REQUIRED) find_package(DtkWidget REQUIRED) find_library(LIB_PCAP NAMES pcap REQUIRED) -find_library(LIB_PROCPS NAMES procps REQUIRED) find_library(LIB_XCB NAMES xcb REQUIRED) find_library(LIB_XEXT NAMES Xext REQUIRED) find_library(LIB_ICCCM NAMES xcb-icccm REQUIRED) @@ -85,6 +84,8 @@ include_directories(${GTEST_INCLUDE_DIRS}) pkg_search_module(LIB_NL3 REQUIRED libnl-3.0) pkg_search_module(LIB_NL3_ROUTE REQUIRED libnl-route-3.0) pkg_search_module(LIB_UDEV REQUIRED libudev) +include_directories(${DtkGui_INCLUDE_DIRS}) +include_directories(${DtkCore_INCLUDE_DIRS}) include_directories(${LIB_NL3_INCLUDE_DIRS}) include_directories(${LIB_NL3_ROUTE_INCLUDE_DIRS}) include_directories(${LIB_UDEV_INCLUDE_DIRS}) @@ -640,7 +641,6 @@ target_link_libraries(${PROJECT_NAME_TEST} KF5::WaylandClient KF5::WaylandServer ${LIB_PCAP} - ${LIB_PROCPS} ICU::i18n ICU::uc ${LIB_XCB}