feat: 实现StartManager功能
实现StartManager功能, 曝露在ApplicationManager服务上 Log: 实现StartManager功能 Task: https://pms.uniontech.com/task-view-130337.html Influence: 无 Change-Id: I8e83a66f8c25b09e0f4be1e4be9defac95b02b80
This commit is contained in:
parent
13a1cabda1
commit
08d9f4895b
1
.gitignore
vendored
1
.gitignore
vendored
@ -0,0 +1 @@
|
|||||||
|
CMakeLists.txt.user
|
@ -7,14 +7,52 @@
|
|||||||
<arg type='s' name='id' direction='in' />
|
<arg type='s' name='id' direction='in' />
|
||||||
<arg type='o' name='info' direction='out' />
|
<arg type='o' name='info' direction='out' />
|
||||||
</method>
|
</method>
|
||||||
<method name='GetId'>
|
|
||||||
<arg type='i' name='pid' direction='in' />
|
|
||||||
<arg type='o' name='instance' direction='out' />
|
|
||||||
</method>
|
|
||||||
<method name='GetInstances'>
|
<method name='GetInstances'>
|
||||||
<arg type='s' name='id' direction='in' />
|
<arg type='s' name='id' direction='in' />
|
||||||
<arg type='ao' name='instances' direction='out' />
|
<arg type='ao' name='instances' direction='out' />
|
||||||
</method>
|
</method>
|
||||||
|
<method name='AddAutostart'>
|
||||||
|
<arg type='s' name='fileNamae' direction='in' />
|
||||||
|
<arg type='b' name='outArg0' direction='out' />
|
||||||
|
</method>
|
||||||
|
<method name='RemoveAutostart'>
|
||||||
|
<arg type='s' name='fileNamae' direction='in' />
|
||||||
|
<arg type='b' name='outArg0' direction='out' />
|
||||||
|
</method>
|
||||||
|
<method name='AutostartList'>
|
||||||
|
<arg type='as' name='outArg0' direction='out' />
|
||||||
|
</method>
|
||||||
|
<method name='DumpMemRecord'>
|
||||||
|
<arg type='s' name='outArg0' direction='out' />
|
||||||
|
</method>
|
||||||
|
<method name='IsAutostart'>
|
||||||
|
<arg type='s' name='fileName' direction='in' />
|
||||||
|
<arg type='b' name='outArg0' direction='out' />
|
||||||
|
</method>
|
||||||
|
<method name='IsMemSufficient'>
|
||||||
|
<arg type='b' name='outArg0' direction='out' />
|
||||||
|
</method>
|
||||||
|
<method name='LaunchApp'>
|
||||||
|
<arg type='s' name='desktopFile' direction='in' />
|
||||||
|
<arg type='u' name='timestamp' direction='in' />
|
||||||
|
<arg type='as' name='files' direction='in' />
|
||||||
|
</method>
|
||||||
|
<method name='LaunchAppAction'>
|
||||||
|
<arg type='s' name='desktopFile' direction='in' />
|
||||||
|
<arg type='s' name='action' direction='in' />
|
||||||
|
<arg type='u' name='timestamp' direction='in' />
|
||||||
|
</method>
|
||||||
|
<method name='RunCommand'>
|
||||||
|
<arg type='s' name='exe' direction='in' />
|
||||||
|
<arg type='as' name='args' direction='in' />
|
||||||
|
</method>
|
||||||
|
<method name='TryAgain'>
|
||||||
|
<arg type='b' name='launch' direction='in' />
|
||||||
|
</method>
|
||||||
|
<signal name='AutostartChanged'>
|
||||||
|
<arg type='s' name='status' />
|
||||||
|
<arg type='s' name='filePath' />
|
||||||
|
</signal>
|
||||||
<property access='read' type='ao' name='list' />
|
<property access='read' type='ao' name='list' />
|
||||||
<property access='read' type='ao' name='instances' />
|
<property access='read' type='ao' name='instances' />
|
||||||
</interface>
|
</interface>
|
||||||
|
1
debian/control
vendored
1
debian/control
vendored
@ -16,6 +16,7 @@ Build-Depends:
|
|||||||
libxcb-icccm4-dev,
|
libxcb-icccm4-dev,
|
||||||
libxcb-ewmh-dev,
|
libxcb-ewmh-dev,
|
||||||
libx11-dev,
|
libx11-dev,
|
||||||
|
libglib2.0-dev,
|
||||||
Standards-Version: 4.1.3
|
Standards-Version: 4.1.3
|
||||||
Homepage: https://www.deepin.org
|
Homepage: https://www.deepin.org
|
||||||
|
|
||||||
|
@ -2,6 +2,8 @@ set(DCONFIG_FILES
|
|||||||
com.deepin.dde.launcher.json
|
com.deepin.dde.launcher.json
|
||||||
com.deepin.dde.dock.json
|
com.deepin.dde.dock.json
|
||||||
com.deepin.dde.appearance.json
|
com.deepin.dde.appearance.json
|
||||||
|
com.deepin.dde.startdde.json
|
||||||
|
com.deepin.dde.xsettings.json
|
||||||
)
|
)
|
||||||
|
|
||||||
install(FILES ${DCONFIG_FILES} DESTINATION /usr/share/dsg/configs/dde-application-manager)
|
install(FILES ${DCONFIG_FILES} DESTINATION /usr/share/dsg/configs/dde-application-manager)
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"contents": {
|
"contents": {
|
||||||
"Extra_Picture_Uris": {
|
"Extra_Picture_Uris": {
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Extra_Picture_Uris",
|
"name": "Extra_Picture_Uris",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
@ -14,7 +14,7 @@
|
|||||||
"Font_Standard": {
|
"Font_Standard": {
|
||||||
"value": "Noto Sans",
|
"value": "Noto Sans",
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Font_Standard",
|
"name": "Font_Standard",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "The standard font for desktop",
|
"description": "The standard font for desktop",
|
||||||
@ -24,7 +24,7 @@
|
|||||||
"Theme_Auto": {
|
"Theme_Auto": {
|
||||||
"value": false,
|
"value": false,
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Theme_Auto",
|
"name": "Theme_Auto",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
@ -34,7 +34,7 @@
|
|||||||
"Wallpaper_Slideshow": {
|
"Wallpaper_Slideshow": {
|
||||||
"value": "",
|
"value": "",
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Wallpaper_Slideshow",
|
"name": "Wallpaper_Slideshow",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
@ -44,7 +44,7 @@
|
|||||||
"Cursor_Theme": {
|
"Cursor_Theme": {
|
||||||
"value": "bloom",
|
"value": "bloom",
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Cursor_Theme",
|
"name": "Cursor_Theme",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "Cursor theme name. Used only by Xservers that support the Xcursor extension.",
|
"description": "Cursor theme name. Used only by Xservers that support the Xcursor extension.",
|
||||||
@ -54,7 +54,7 @@
|
|||||||
"Font_Size": {
|
"Font_Size": {
|
||||||
"value": 10.5,
|
"value": 10.5,
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Font_Size",
|
"name": "Font_Size",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "The desktop font size",
|
"description": "The desktop font size",
|
||||||
@ -64,7 +64,7 @@
|
|||||||
"Wallpaper_Uris": {
|
"Wallpaper_Uris": {
|
||||||
"value": "",
|
"value": "",
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Wallpaper_Uris",
|
"name": "Wallpaper_Uris",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "wallpaper json string",
|
"description": "wallpaper json string",
|
||||||
@ -74,7 +74,7 @@
|
|||||||
"Icon_Theme": {
|
"Icon_Theme": {
|
||||||
"value": "bloom",
|
"value": "bloom",
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Icon_Theme",
|
"name": "Icon_Theme",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "Icon theme to use for the panel, nautilus etc.",
|
"description": "Icon theme to use for the panel, nautilus etc.",
|
||||||
@ -82,9 +82,9 @@
|
|||||||
"visibility": "private"
|
"visibility": "private"
|
||||||
},
|
},
|
||||||
"Opacity": {
|
"Opacity": {
|
||||||
"value": 0.40000000000000002,
|
"value": 0.4,
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Opacity",
|
"name": "Opacity",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
@ -94,7 +94,7 @@
|
|||||||
"Font_Monospace": {
|
"Font_Monospace": {
|
||||||
"value": "Noto Mono",
|
"value": "Noto Mono",
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Font_Monospace",
|
"name": "Font_Monospace",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "The monospace font for desktop",
|
"description": "The monospace font for desktop",
|
||||||
@ -104,7 +104,7 @@
|
|||||||
"Excluded_Icon_Themes": {
|
"Excluded_Icon_Themes": {
|
||||||
"value": ["hicolor", "gnome", "Adwaita"],
|
"value": ["hicolor", "gnome", "Adwaita"],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Excluded_Icon_Themes",
|
"name": "Excluded_Icon_Themes",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "Icon theme black list.",
|
"description": "Icon theme black list.",
|
||||||
@ -114,7 +114,7 @@
|
|||||||
"Gtk_Theme": {
|
"Gtk_Theme": {
|
||||||
"value": "deepin",
|
"value": "deepin",
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Gtk_Theme",
|
"name": "Gtk_Theme",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "Basename of the default theme used by gtk+.",
|
"description": "Basename of the default theme used by gtk+.",
|
||||||
@ -124,7 +124,7 @@
|
|||||||
"Sound_Theme": {
|
"Sound_Theme": {
|
||||||
"value": "deepin",
|
"value": "deepin",
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Sound_Theme",
|
"name": "Sound_Theme",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "Set the system sound theme",
|
"description": "Set the system sound theme",
|
||||||
@ -134,7 +134,7 @@
|
|||||||
"Background_Uris": {
|
"Background_Uris": {
|
||||||
"value": ["file:///usr/share/backgrounds/default_background.jpg"],
|
"value": ["file:///usr/share/backgrounds/default_background.jpg"],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Background_Uris",
|
"name": "Background_Uris",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "Note that the backend only supports local (file://) URIs.",
|
"description": "Note that the backend only supports local (file://) URIs.",
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
"Window_Size_Fashion": {
|
"Window_Size_Fashion": {
|
||||||
"value": 48,
|
"value": 48,
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Window_Size_Fashion",
|
"name": "Window_Size_Fashion",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
@ -15,7 +15,7 @@
|
|||||||
"Icon_Size": {
|
"Icon_Size": {
|
||||||
"value": 36,
|
"value": 36,
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Icon_Size",
|
"name": "Icon_Size",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
@ -25,7 +25,7 @@
|
|||||||
"Position": {
|
"Position": {
|
||||||
"value": "bottom",
|
"value": "bottom",
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Position",
|
"name": "Position",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
@ -35,7 +35,7 @@
|
|||||||
"Wireless_Scan_Interval": {
|
"Wireless_Scan_Interval": {
|
||||||
"value": 5,
|
"value": 5,
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Wireless_Scan_Interval",
|
"name": "Wireless_Scan_Interval",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "wireless scan interval",
|
"description": "wireless scan interval",
|
||||||
@ -45,7 +45,7 @@
|
|||||||
"Hide_Timeout": {
|
"Hide_Timeout": {
|
||||||
"value": 0,
|
"value": 0,
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Hide_Timeout",
|
"name": "Hide_Timeout",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
@ -55,7 +55,7 @@
|
|||||||
"Hide_Mode": {
|
"Hide_Mode": {
|
||||||
"value": "keep-showing",
|
"value": "keep-showing",
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Hide_Mode",
|
"name": "Hide_Mode",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "The value will influence when the dock is shown or hidden.",
|
"description": "The value will influence when the dock is shown or hidden.",
|
||||||
@ -65,7 +65,7 @@
|
|||||||
"Show_Timeout": {
|
"Show_Timeout": {
|
||||||
"value": 100,
|
"value": 100,
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Show_Timeout",
|
"name": "Show_Timeout",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
@ -75,7 +75,7 @@
|
|||||||
"Window_Size_Efficient": {
|
"Window_Size_Efficient": {
|
||||||
"value": 40,
|
"value": 40,
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Window_Size_Efficient",
|
"name": "Window_Size_Efficient",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
@ -85,7 +85,7 @@
|
|||||||
"Plugin_Settings": {
|
"Plugin_Settings": {
|
||||||
"value": "{}",
|
"value": "{}",
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Plugin_Settings",
|
"name": "Plugin_Settings",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
@ -95,7 +95,7 @@
|
|||||||
"Docked_Apps": {
|
"Docked_Apps": {
|
||||||
"value": ["/S@dde-file-manager", "/S@uos-browser", "/S@org.deepin.browser", "/S@deepin-appstore", "/S@deepin-app-store", "/S@com.deepin.store.intranet", "/S@deepin-album", "/S@deepin-music", "/S@deepin-contacts", "/S@dde-calendar", "/S@dde-control-center"],
|
"value": ["/S@dde-file-manager", "/S@uos-browser", "/S@org.deepin.browser", "/S@deepin-appstore", "/S@deepin-app-store", "/S@com.deepin.store.intranet", "/S@deepin-album", "/S@deepin-music", "/S@deepin-contacts", "/S@dde-calendar", "/S@dde-control-center"],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Docked_Apps",
|
"name": "Docked_Apps",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "The default apps which is docked when dock is started.",
|
"description": "The default apps which is docked when dock is started.",
|
||||||
@ -105,7 +105,7 @@
|
|||||||
"Win_Icon_Preferred_Apps": {
|
"Win_Icon_Preferred_Apps": {
|
||||||
"value": ["apps.com.qq.im", "deepin.com.qq.im", "apps.com.qq.im.light", "apps.com.qq.b.eim", "apps.com.qq.rtxclient"],
|
"value": ["apps.com.qq.im", "deepin.com.qq.im", "apps.com.qq.im.light", "apps.com.qq.b.eim", "apps.com.qq.rtxclient"],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Win_Icon_Preferred_Apps",
|
"name": "Win_Icon_Preferred_Apps",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
@ -115,7 +115,7 @@
|
|||||||
"Delay_Plugins_Time": {
|
"Delay_Plugins_Time": {
|
||||||
"value": 0,
|
"value": 0,
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Delay_Plugins_Time",
|
"name": "Delay_Plugins_Time",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
@ -125,7 +125,7 @@
|
|||||||
"Force_Quit_App": {
|
"Force_Quit_App": {
|
||||||
"value": "enabled",
|
"value": "enabled",
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Force_Quit_App",
|
"name": "Force_Quit_App",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
@ -135,7 +135,7 @@
|
|||||||
"Display_Mode": {
|
"Display_Mode": {
|
||||||
"value": "efficient",
|
"value": "efficient",
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Display_Mode",
|
"name": "Display_Mode",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "The dock gets different display mode, for instance, dock looks like win7 taskbar on classic mode.",
|
"description": "The dock gets different display mode, for instance, dock looks like win7 taskbar on classic mode.",
|
||||||
|
@ -2,11 +2,11 @@
|
|||||||
"magic": "dsg.config.meta",
|
"magic": "dsg.config.meta",
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"contents": {
|
"contents": {
|
||||||
"Apps_Can_Not_Start_Up_List": {
|
"Apps_Disable_AutoStart": {
|
||||||
"value": [],
|
"value": [],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Can_Not_Start_Up_List",
|
"name": "Apps_Disable_AutoStart",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "apps not allowed to start up",
|
"description": "apps not allowed to start up",
|
||||||
"permissions": "readwrite",
|
"permissions": "readwrite",
|
||||||
@ -15,7 +15,7 @@
|
|||||||
"Apps_Order_Zh_Cn": {
|
"Apps_Order_Zh_Cn": {
|
||||||
"value": ["uos-browser", "org.deepin.browser", "dde-file-manager", "deepin-app-store", "deepin-appstore", "deepin-music", "deepin-movie", "deepin-screen-recorder", "deepin-image-viewer", "deepin-album", "deepin-draw", "deepin-reader", "deepin-editor", "deepin-mail", "thunderbird", "deepin-terminal", "terminal", "org.gnome.Terminal", "deepin-contacts", "deepin-voice-note", "downloader", "deepin-manual", "org.deepin.scanner", "org.deepin.scaner", "dde-computer", "dde-trash", "deepin-defender", "dde-control-center", "chineseime-setting", "fcitx-config-gtk3", "chineseime-setting-wizard", "deepin-system-monitor", "deepin-boot-maker", "deepin-devicemanager", "deepin-log-viewer", "dde-printer", "dde-calendar", "deepin-calculator", "deepin-font-manager", "deepin-compressor", "deepin-deb-installer", "deepin-diskmanager", "dde-introduction", "uos-service-support", "uos-remote-assistance", "deepin-camera", "deepin-phone-master", "gparted", "org.gnome.Cheese", "Cheese", "gnome.Cheese"],
|
"value": ["uos-browser", "org.deepin.browser", "dde-file-manager", "deepin-app-store", "deepin-appstore", "deepin-music", "deepin-movie", "deepin-screen-recorder", "deepin-image-viewer", "deepin-album", "deepin-draw", "deepin-reader", "deepin-editor", "deepin-mail", "thunderbird", "deepin-terminal", "terminal", "org.gnome.Terminal", "deepin-contacts", "deepin-voice-note", "downloader", "deepin-manual", "org.deepin.scanner", "org.deepin.scaner", "dde-computer", "dde-trash", "deepin-defender", "dde-control-center", "chineseime-setting", "fcitx-config-gtk3", "chineseime-setting-wizard", "deepin-system-monitor", "deepin-boot-maker", "deepin-devicemanager", "deepin-log-viewer", "dde-printer", "dde-calendar", "deepin-calculator", "deepin-font-manager", "deepin-compressor", "deepin-deb-installer", "deepin-diskmanager", "dde-introduction", "uos-service-support", "uos-remote-assistance", "deepin-camera", "deepin-phone-master", "gparted", "org.gnome.Cheese", "Cheese", "gnome.Cheese"],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Order_Zh_Cn",
|
"name": "Apps_Order_Zh_Cn",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "launcher apps order, ensure that all lowercase.",
|
"description": "launcher apps order, ensure that all lowercase.",
|
||||||
@ -25,28 +25,28 @@
|
|||||||
"Apps_Icon_Ratio": {
|
"Apps_Icon_Ratio": {
|
||||||
"value": 0.5,
|
"value": 0.5,
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Icon_Ratio",
|
"name": "Apps_Icon_Ratio",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "(null)",
|
"description": "(null)",
|
||||||
"permissions": "readwrite",
|
"permissions": "readwrite",
|
||||||
"visibility": "private"
|
"visibility": "private"
|
||||||
},
|
},
|
||||||
"Apps_Can_Not_Use_Proxy_List": {
|
"Apps_Disable_UseProxy": {
|
||||||
"value": [],
|
"value": [],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Can_Not_Use_Proxy_List",
|
"name": "Apps_Disable_UseProxy",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "apps disable use proxy menu",
|
"description": "apps disable use proxy menu",
|
||||||
"permissions": "readwrite",
|
"permissions": "readwrite",
|
||||||
"visibility": "private"
|
"visibility": "private"
|
||||||
},
|
},
|
||||||
"Apps_Hide_Start_Up_List": {
|
"Apps_Without_AutoStart": {
|
||||||
"value": [],
|
"value": [],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Hide_Start_Up_List",
|
"name": "Apps_Without_AutoStart",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "apps hide function start up",
|
"description": "apps hide function start up",
|
||||||
"permissions": "readwrite",
|
"permissions": "readwrite",
|
||||||
@ -55,7 +55,7 @@
|
|||||||
"Fullscreen": {
|
"Fullscreen": {
|
||||||
"value": false,
|
"value": false,
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Fullscreen",
|
"name": "Fullscreen",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "(null)",
|
"description": "(null)",
|
||||||
@ -65,7 +65,7 @@
|
|||||||
"Mini_Frame_Right_Bar_Hide_List": {
|
"Mini_Frame_Right_Bar_Hide_List": {
|
||||||
"value": [],
|
"value": [],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Mini_Frame_Right_Bar_Hide_List",
|
"name": "Mini_Frame_Right_Bar_Hide_List",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "icons not allowed to show on mini frame right bar",
|
"description": "icons not allowed to show on mini frame right bar",
|
||||||
@ -75,7 +75,7 @@
|
|||||||
"Auto_Exit": {
|
"Auto_Exit": {
|
||||||
"value": false,
|
"value": false,
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Auto_Exit",
|
"name": "Auto_Exit",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "(null)",
|
"description": "(null)",
|
||||||
@ -85,38 +85,38 @@
|
|||||||
"Apps_Order_Zh_Tw": {
|
"Apps_Order_Zh_Tw": {
|
||||||
"value": ["uos-browser", "org.deepin.browser", "dde-file-manager", "deepin-app-store", "deepin-appstore", "deepin-music", "deepin-movie", "deepin-screen-recorder", "deepin-image-viewer", "deepin-album", "deepin-draw", "deepin-reader", "deepin-editor", "deepin-mail", "thunderbird", "deepin-terminal", "terminal", "org.gnome.Terminal", "deepin-contacts", "deepin-voice-note", "downloader", "deepin-manual", "org.deepin.scanner", "org.deepin.scaner", "dde-computer", "dde-trash", "deepin-defender", "dde-control-center", "chineseime-setting", "fcitx-config-gtk3", "chineseime-setting-wizard", "deepin-system-monitor", "deepin-boot-maker", "deepin-devicemanager", "deepin-log-viewer", "dde-printer", "dde-calendar", "deepin-calculator", "deepin-font-manager", "deepin-compressor", "deepin-deb-installer", "deepin-diskmanager", "dde-introduction", "uos-service-support", "uos-remote-assistance", "deepin-camera", "deepin-phone-master", "gparted", "org.gnome.Cheese", "Cheese", "gnome.Cheese"],
|
"value": ["uos-browser", "org.deepin.browser", "dde-file-manager", "deepin-app-store", "deepin-appstore", "deepin-music", "deepin-movie", "deepin-screen-recorder", "deepin-image-viewer", "deepin-album", "deepin-draw", "deepin-reader", "deepin-editor", "deepin-mail", "thunderbird", "deepin-terminal", "terminal", "org.gnome.Terminal", "deepin-contacts", "deepin-voice-note", "downloader", "deepin-manual", "org.deepin.scanner", "org.deepin.scaner", "dde-computer", "dde-trash", "deepin-defender", "dde-control-center", "chineseime-setting", "fcitx-config-gtk3", "chineseime-setting-wizard", "deepin-system-monitor", "deepin-boot-maker", "deepin-devicemanager", "deepin-log-viewer", "dde-printer", "dde-calendar", "deepin-calculator", "deepin-font-manager", "deepin-compressor", "deepin-deb-installer", "deepin-diskmanager", "dde-introduction", "uos-service-support", "uos-remote-assistance", "deepin-camera", "deepin-phone-master", "gparted", "org.gnome.Cheese", "Cheese", "gnome.Cheese"],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Order_Zh_Tw",
|
"name": "Apps_Order_Zh_Tw",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "launcher apps order, ensure that all lowercase.",
|
"description": "launcher apps order, ensure that all lowercase.",
|
||||||
"permissions": "readwrite",
|
"permissions": "readwrite",
|
||||||
"visibility": "private"
|
"visibility": "private"
|
||||||
},
|
},
|
||||||
"Apps_Can_Not_Send_To_Dock_List": {
|
"Apps_Disable_SendDock": {
|
||||||
"value": [],
|
"value": [],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Can_Not_Send_To_Dock_List",
|
"name": "Apps_Disable_SendDock",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "apps not allowed to send to Dock",
|
"description": "apps not allowed to send to Dock",
|
||||||
"permissions": "readwrite",
|
"permissions": "readwrite",
|
||||||
"visibility": "private"
|
"visibility": "private"
|
||||||
},
|
},
|
||||||
"Apps_Can_Not_Send_To_Desktop_List": {
|
"Apps_Disable_SendDesktop": {
|
||||||
"value": [],
|
"value": [],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Can_Not_Send_To_Desktop_List",
|
"name": "Apps_Disable_SendDesktop",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "apps not allowed to send to Desktop",
|
"description": "apps not allowed to send to Desktop",
|
||||||
"permissions": "readwrite",
|
"permissions": "readwrite",
|
||||||
"visibility": "private"
|
"visibility": "private"
|
||||||
},
|
},
|
||||||
"Apps_Hide_Send_To_Desktop_List": {
|
"Apps_Without_SendDesktop": {
|
||||||
"value": [],
|
"value": [],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Hide_Send_To_Desktop_List",
|
"name": "Apps_Without_SendDesktop",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "apps hide function send to desktop",
|
"description": "apps hide function send to desktop",
|
||||||
"permissions": "readwrite",
|
"permissions": "readwrite",
|
||||||
@ -125,28 +125,28 @@
|
|||||||
"Apps_Hold_List": {
|
"Apps_Hold_List": {
|
||||||
"value": ["dde-introduction", "dde-file-manager", "deepin-appstore", "deepin-app-store", "deepin-terminal", "deepin-manual", "dde-computer", "dde-trash", "deepin-defender", "dde-control-center", "fcitx-config-gtk3", "fcitx-configtool", "deepin-system-monitor", "deepin-devicemanager", "dde-printer", "dde-calendar", "uos-service-support", "deepin-toggle-desktop", "deepin-wm-multitaskingview", "kwin-wm-multitaskingview", "com.deepin.store.intranet", "chineseime-setting"],
|
"value": ["dde-introduction", "dde-file-manager", "deepin-appstore", "deepin-app-store", "deepin-terminal", "deepin-manual", "dde-computer", "dde-trash", "deepin-defender", "dde-control-center", "fcitx-config-gtk3", "fcitx-configtool", "deepin-system-monitor", "deepin-devicemanager", "dde-printer", "dde-calendar", "uos-service-support", "deepin-toggle-desktop", "deepin-wm-multitaskingview", "kwin-wm-multitaskingview", "com.deepin.store.intranet", "chineseime-setting"],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Hold_List",
|
"name": "Apps_Hold_List",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "apps not allowed to uninstall",
|
"description": "apps not allowed to uninstall",
|
||||||
"permissions": "readwrite",
|
"permissions": "readwrite",
|
||||||
"visibility": "private"
|
"visibility": "private"
|
||||||
},
|
},
|
||||||
"Apps_Hide_Open_List": {
|
"Apps_Without_Open": {
|
||||||
"value": [],
|
"value": [],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Hide_Open_List",
|
"name": "Apps_Without_Open",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "apps hide function open",
|
"description": "apps hide function open",
|
||||||
"permissions": "readwrite",
|
"permissions": "readwrite",
|
||||||
"visibility": "private"
|
"visibility": "private"
|
||||||
},
|
},
|
||||||
"Apps_Can_Not_Open_List": {
|
"Apps_Disable_Open": {
|
||||||
"value": [],
|
"value": [],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Can_Not_Open_List",
|
"name": "Apps_Disable_Open",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "apps not allowed to open",
|
"description": "apps not allowed to open",
|
||||||
"permissions": "readwrite",
|
"permissions": "readwrite",
|
||||||
@ -155,7 +155,7 @@
|
|||||||
"Apps_Use_Proxy": {
|
"Apps_Use_Proxy": {
|
||||||
"value": [],
|
"value": [],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Use_Proxy",
|
"name": "Apps_Use_Proxy",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
@ -165,7 +165,7 @@
|
|||||||
"Search_Package_Name": {
|
"Search_Package_Name": {
|
||||||
"value": false,
|
"value": false,
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Search_Package_Name",
|
"name": "Search_Package_Name",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
@ -175,18 +175,18 @@
|
|||||||
"Apps_Order": {
|
"Apps_Order": {
|
||||||
"value": ["uos-browser", "org.deepin.browser", "dde-file-manager", "deepin-app-store", "deepin-appstore", "deepin-music", "deepin-movie", "deepin-screen-recorder", "deepin-image-viewer", "deepin-album", "deepin-draw", "deepin-reader", "deepin-editor", "deepin-mail", "thunderbird", "deepin-terminal", "terminal", "org.gnome.Terminal", "deepin-contacts", "deepin-voice-note", "downloader", "deepin-manual", "org.deepin.scanner", "org.deepin.scaner", "dde-computer", "dde-trash", "deepin-defender", "dde-control-center", "chineseime-setting", "fcitx-config-gtk3", "chineseime-setting-wizard", "deepin-system-monitor", "deepin-boot-maker", "deepin-devicemanager", "deepin-log-viewer", "dde-printer", "dde-calendar", "deepin-calculator", "deepin-font-manager", "deepin-compressor", "deepin-deb-installer", "deepin-diskmanager", "dde-introduction", "uos-service-support", "uos-remote-assistance", "deepin-camera", "deepin-phone-master", "gparted", "org.gnome.Cheese", "Cheese", "gnome.Cheese"],
|
"value": ["uos-browser", "org.deepin.browser", "dde-file-manager", "deepin-app-store", "deepin-appstore", "deepin-music", "deepin-movie", "deepin-screen-recorder", "deepin-image-viewer", "deepin-album", "deepin-draw", "deepin-reader", "deepin-editor", "deepin-mail", "thunderbird", "deepin-terminal", "terminal", "org.gnome.Terminal", "deepin-contacts", "deepin-voice-note", "downloader", "deepin-manual", "org.deepin.scanner", "org.deepin.scaner", "dde-computer", "dde-trash", "deepin-defender", "dde-control-center", "chineseime-setting", "fcitx-config-gtk3", "chineseime-setting-wizard", "deepin-system-monitor", "deepin-boot-maker", "deepin-devicemanager", "deepin-log-viewer", "dde-printer", "dde-calendar", "deepin-calculator", "deepin-font-manager", "deepin-compressor", "deepin-deb-installer", "deepin-diskmanager", "dde-introduction", "uos-service-support", "uos-remote-assistance", "deepin-camera", "deepin-phone-master", "gparted", "org.gnome.Cheese", "Cheese", "gnome.Cheese"],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Order",
|
"name": "Apps_Order",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "launcher apps order, ensure that all lowercase.",
|
"description": "launcher apps order, ensure that all lowercase.",
|
||||||
"permissions": "readwrite",
|
"permissions": "readwrite",
|
||||||
"visibility": "private"
|
"visibility": "private"
|
||||||
},
|
},
|
||||||
"Apps_Hide_Use_Proxy_List": {
|
"Apps_Without_UseProxy": {
|
||||||
"value": [],
|
"value": [],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Hide_Use_Proxy_List",
|
"name": "Apps_Without_UseProxy",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "apps hide use proxy menu",
|
"description": "apps hide use proxy menu",
|
||||||
"permissions": "readwrite",
|
"permissions": "readwrite",
|
||||||
@ -195,7 +195,7 @@
|
|||||||
"Apps_Disable_Scaling": {
|
"Apps_Disable_Scaling": {
|
||||||
"value": [],
|
"value": [],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Disable_Scaling",
|
"name": "Apps_Disable_Scaling",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
@ -205,28 +205,28 @@
|
|||||||
"Apps_Hidden": {
|
"Apps_Hidden": {
|
||||||
"value": [],
|
"value": [],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Hidden",
|
"name": "Apps_Hidden",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "",
|
"description": "",
|
||||||
"permissions": "readwrite",
|
"permissions": "readwrite",
|
||||||
"visibility": "private"
|
"visibility": "private"
|
||||||
},
|
},
|
||||||
"Apps_Hide_Send_To_Dock_List": {
|
"Apps_Without_SendDock": {
|
||||||
"value": [],
|
"value": [],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Hide_Send_To_Dock_List",
|
"name": "Apps_Without_SendDock",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "apps hide function send to dock",
|
"description": "apps hide function send to dock",
|
||||||
"permissions": "readwrite",
|
"permissions": "readwrite",
|
||||||
"visibility": "private"
|
"visibility": "private"
|
||||||
},
|
},
|
||||||
"Apps_Hide_Uninstall_List": {
|
"Apps_Without_Uninstall": {
|
||||||
"value": [],
|
"value": [],
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Apps_Hide_Uninstall_List",
|
"name": "Apps_Without_Uninstall",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "apps hide function uninstall",
|
"description": "apps hide function uninstall",
|
||||||
"permissions": "readwrite",
|
"permissions": "readwrite",
|
||||||
@ -235,7 +235,7 @@
|
|||||||
"Display_Mode": {
|
"Display_Mode": {
|
||||||
"value": "free",
|
"value": "free",
|
||||||
"serial": 0,
|
"serial": 0,
|
||||||
"flags": ["global"],
|
"flags": [],
|
||||||
"name": "Display_Mode",
|
"name": "Display_Mode",
|
||||||
"name[zh_CN]": "*****",
|
"name[zh_CN]": "*****",
|
||||||
"description": "Launcher display mode.",
|
"description": "Launcher display mode.",
|
||||||
|
96
misc/dconf/com.deepin.dde.startdde.json
Normal file
96
misc/dconf/com.deepin.dde.startdde.json
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
{
|
||||||
|
"magic": "dsg.config.meta",
|
||||||
|
"version": "1.0",
|
||||||
|
"contents": {
|
||||||
|
"Wm_Cmd": {
|
||||||
|
"value": "",
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Wm_Cmd",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "This key will special window manager at startdde startup. If empty, using deepin-wm.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Quick_Black_Screen": {
|
||||||
|
"value": true,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Quick_Black_Screen",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Swap_Sched_Enabled": {
|
||||||
|
"value": true,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Swap_Sched_Enabled",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Launch_Welcome": {
|
||||||
|
"value": true,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Launch_Welcome",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "This key will indicate whether showing dde-welcome.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Autostart_Delay": {
|
||||||
|
"value": 0,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Autostart_Delay",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "The delay seconds for autostart",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Turbo_Invoker_Enabled": {
|
||||||
|
"value": false,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Turbo_Invoker_Enabled",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Login_Reminder": {
|
||||||
|
"value": false,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Login_Reminder",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Iowait_Enabled": {
|
||||||
|
"value": false,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Iowait_Enabled",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Memchecker_Enabled": {
|
||||||
|
"value": false,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Memchecker_Enabled",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
337
misc/dconf/com.deepin.dde.xsettings.json
Normal file
337
misc/dconf/com.deepin.dde.xsettings.json
Normal file
@ -0,0 +1,337 @@
|
|||||||
|
{
|
||||||
|
"magic": "dsg.config.meta",
|
||||||
|
"version": "1.0",
|
||||||
|
"contents": {
|
||||||
|
"Qt_Active_Color": {
|
||||||
|
"value": "0,33153,65535,65535",
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Qt_Active_Color",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Xft_Antialias": {
|
||||||
|
"value": true,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Xft_Antialias",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Whether to antialias Xft fonts; 0=no, 1=yes, -1=default.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Gtk_Cursor_Theme_Name": {
|
||||||
|
"value": "bloom",
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Gtk_Cursor_Theme_Name",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Cursor theme name. Used only by Xservers that support the Xcursor extension.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Dtk_Window_Radius": {
|
||||||
|
"value": 18,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Dtk_Window_Radius",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "The window radius last time",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Gtk_Cursor_Blink_Timeout": {
|
||||||
|
"value": 10,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Gtk_Cursor_Blink_Timeout",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Time after which the cursor stops blinking, in seconds.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Scale_Factor": {
|
||||||
|
"value": 1.0,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Scale_Factor",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Text scale for Gdk.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Gtk_Key_Theme_Name": {
|
||||||
|
"value": "default",
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Gtk_Key_Theme_Name",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Basename of the default keybinding theme used by gtk+.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Cursor_Blink_Time": {
|
||||||
|
"value": 1200,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Cursor_Blink_Time",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Length of the cursor blink cycle, in milliseconds.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Enable_Event_Sounds": {
|
||||||
|
"value": true,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Enable_Event_Sounds",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Whether to play any event sounds at all.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Qt_Font_Name": {
|
||||||
|
"value": "",
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Qt_Font_Name",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Gtk_Theme_Name": {
|
||||||
|
"value": "deepin",
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Gtk_Theme_Name",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Basename of the default theme used by gtk+.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Double_Click_Time": {
|
||||||
|
"value": 250,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Double_Click_Time",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Maximum time allowed between two clicks for them to be considered a double click (in milliseconds).",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Icon_Theme_Name": {
|
||||||
|
"value": "deepin",
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Icon_Theme_Name",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Icon theme to use for the panel, nautilus etc.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Primary_Monitor_Name": {
|
||||||
|
"value": "eDP-1",
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Primary_Monitor_Name",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Dnd_Drag_Threshold": {
|
||||||
|
"value": 8,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Dnd_Drag_Threshold",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "A palette of named colors for use in themes.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Sound_Theme_Name": {
|
||||||
|
"value": "deepin",
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Sound_Theme_Name",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Set the system sound theme",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Double_Click_Distance": {
|
||||||
|
"value": 5,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Double_Click_Distance",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Maximum distance allowed between two clicks for them to be considered a double click (in pixels).",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Xft_Hinting": {
|
||||||
|
"value": true,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Xft_Hinting",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Whether to hint Xft fonts; 0=no, 1=yes, -1=default.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Theme_Name": {
|
||||||
|
"value": "deepin",
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Theme_Name",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Theme to use for gtk+ and qt.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Gtk_Cursor_Theme_Size": {
|
||||||
|
"value": 24,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Gtk_Cursor_Theme_Size",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Timeout in milliseconds before a click starts repeating (onspinner buttons for example).",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Icon_Theme_Fallback": {
|
||||||
|
"value": "default",
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Icon_Theme_Fallback",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Name of a icon theme to fall back to.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Xft_Rgba": {
|
||||||
|
"value": "rgb",
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Xft_Rgba",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Type of subpixel antialiasing; none, rgb, bgr, vrgb, vbgr.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Window_Scale": {
|
||||||
|
"value": 1,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Window_Scale",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Window scale for Gdk.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Gtk_Recent_Files_Enabled": {
|
||||||
|
"value": true,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Gtk_Recent_Files_Enabled",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Whether GTK+ should keep track of items inside the recently used resources list.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Qt_Mono_Font_Name": {
|
||||||
|
"value": "",
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Qt_Mono_Font_Name",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Cursor_Blink": {
|
||||||
|
"value": true,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Cursor_Blink",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Whether the cursor should blink.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Individual_Scaling": {
|
||||||
|
"value": "",
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Individual_Scaling",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Semicolon-separated list of name=value pairs, as used in QT_SCREEN_SCALE_FACTORS.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Xft_Dpi": {
|
||||||
|
"value": -1,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Xft_Dpi",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Resolution for Xft, in 1024 * dots/inch. -1 to use default value. Do not modify it manually.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Enable_Input_Feedback_Sounds": {
|
||||||
|
"value": true,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Enable_Input_Feedback_Sounds",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Whether to play event sounds as feedback to user input.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Xft_Hintstyle": {
|
||||||
|
"value": "hintfull",
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Xft_Hintstyle",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "What degree of hinting to use; hintnone, hintslight, hintmedium, or hintfull.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Qt_Font_Point_Size": {
|
||||||
|
"value": 10.5,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Qt_Font_Point_Size",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Gtk_Recent_Files_Max_Age": {
|
||||||
|
"value": 30,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Gtk_Recent_Files_Max_Age",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "The maximum age, in days, of the items inside the recently used resources list. Items older than this setting will be excised from the list. If set to 0, the list will always be empty; if set to -1, no item will be removed.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
},
|
||||||
|
"Gtk_Font_Name": {
|
||||||
|
"value": "sans-serif 10.5",
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Gtk_Font_Name",
|
||||||
|
"name[zh_CN]": "*****",
|
||||||
|
"description": "Name of the default font used by gtk+.",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "private"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
41
src/lib/applaunchcontext.cpp
Normal file
41
src/lib/applaunchcontext.cpp
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
|
*
|
||||||
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* Maintainer: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "applaunchcontext.h"
|
||||||
|
|
||||||
|
AppLaunchContext::AppLaunchContext()
|
||||||
|
: m_count(0)
|
||||||
|
, m_timestamp(0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
std::string AppLaunchContext::getStartupNotifyId(const DesktopInfo *info, std::vector<std::string> files)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
void AppLaunchContext::launchFailed(std::string startupNotifyId)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
58
src/lib/applaunchcontext.h
Normal file
58
src/lib/applaunchcontext.h
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
|
*
|
||||||
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* Maintainer: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef APPLAUNCHCONTEXT_H
|
||||||
|
#define APPLAUNCHCONTEXT_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class DesktopInfo;
|
||||||
|
class AppLaunchContext
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
AppLaunchContext();
|
||||||
|
|
||||||
|
void setEnv(const std::vector<std::string> &value) {m_env = value;}
|
||||||
|
std::vector<std::string> getEnv() {return m_env;}
|
||||||
|
|
||||||
|
void setTimestamp(uint32_t value) {m_timestamp = value;}
|
||||||
|
uint32_t getTimestamp() {return m_timestamp;}
|
||||||
|
|
||||||
|
void setCmdPrefixes(const std::vector<std::string> &value) {m_cmdPrefixes = value;}
|
||||||
|
std::vector<std::string> getCmdPrefixes() {return m_cmdPrefixes;}
|
||||||
|
|
||||||
|
void setCmdSuffixes(const std::vector<std::string> &value) {m_cmdSuffixes = value;}
|
||||||
|
std::vector<std::string> getCmdSuffixes() {return m_cmdSuffixes;}
|
||||||
|
|
||||||
|
std::string getStartupNotifyId(const DesktopInfo *info, std::vector<std::string> files);
|
||||||
|
|
||||||
|
void launchFailed(std::string startupNotifyId);
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint m_count;
|
||||||
|
uint32_t m_timestamp;
|
||||||
|
std::vector<std::string> m_cmdPrefixes;
|
||||||
|
std::vector<std::string> m_cmdSuffixes;
|
||||||
|
std::vector<std::string> m_env;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // APPLAUNCHCONTEXT_H
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -39,11 +39,11 @@ std::string BaseDir::homeDir()
|
|||||||
return std::string(home) + "/";
|
return std::string(home) + "/";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string BaseDir::uerDataDir()
|
std::string BaseDir::userDataDir()
|
||||||
{
|
{
|
||||||
// default $HOME/.local/share
|
// default $HOME/.local/share
|
||||||
std::string home = homeDir();
|
std::string home = homeDir();
|
||||||
std::string defaultDir = home.size() > 0 ? home + ".local/share/" : "";
|
std::string defaultDir = (home.size() > 0) ? home + ".local/share/" : "";
|
||||||
const char *xdgDataHomePtr = getenv("XDG_DATA_HOME");
|
const char *xdgDataHomePtr = getenv("XDG_DATA_HOME");
|
||||||
if (!xdgDataHomePtr)
|
if (!xdgDataHomePtr)
|
||||||
return defaultDir;
|
return defaultDir;
|
||||||
@ -106,7 +106,7 @@ std::vector<std::string> BaseDir::sysConfigDirs()
|
|||||||
std::string BaseDir::userCacheDir()
|
std::string BaseDir::userCacheDir()
|
||||||
{
|
{
|
||||||
std::string home = homeDir();
|
std::string home = homeDir();
|
||||||
std::string defaultDir = home.size() > 0 ? home + ".cache/" : "";
|
std::string defaultDir = (home.size() > 0) ? home + ".cache/" : "";
|
||||||
const char *xdgCacheHomePtr = getenv("XDG_CACHE_HOME");
|
const char *xdgCacheHomePtr = getenv("XDG_CACHE_HOME");
|
||||||
if (!xdgCacheHomePtr)
|
if (!xdgCacheHomePtr)
|
||||||
return defaultDir;
|
return defaultDir;
|
||||||
@ -120,8 +120,8 @@ std::string BaseDir::userCacheDir()
|
|||||||
|
|
||||||
std::string BaseDir::userAppDir()
|
std::string BaseDir::userAppDir()
|
||||||
{
|
{
|
||||||
std::string dataDir = uerDataDir();
|
std::string dataDir = userDataDir();
|
||||||
return dataDir.size() > 0 ? dataDir + "appliations/" : "";
|
return (dataDir.size() > 0) ? dataDir + "appliations/" : "";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> BaseDir::sysAppDirs()
|
std::vector<std::string> BaseDir::sysAppDirs()
|
||||||
@ -150,6 +150,11 @@ std::vector<std::string> BaseDir::autoStartDirs()
|
|||||||
return autoStartDirs;
|
return autoStartDirs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string BaseDir::userAutoStartDir()
|
||||||
|
{
|
||||||
|
return userConfigDir() + "autostart/";
|
||||||
|
}
|
||||||
|
|
||||||
void BaseDir::filterNotAbs(std::vector<std::string> &dirs)
|
void BaseDir::filterNotAbs(std::vector<std::string> &dirs)
|
||||||
{
|
{
|
||||||
for (auto iter = dirs.begin(); iter != dirs.end();) { // erase element in vector
|
for (auto iter = dirs.begin(); iter != dirs.end();) { // erase element in vector
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -32,7 +32,7 @@ public:
|
|||||||
BaseDir();
|
BaseDir();
|
||||||
|
|
||||||
static std::string homeDir();
|
static std::string homeDir();
|
||||||
static std::string uerDataDir();
|
static std::string userDataDir();
|
||||||
static std::vector<std::string> sysDataDirs();
|
static std::vector<std::string> sysDataDirs();
|
||||||
static std::string userConfigDir();
|
static std::string userConfigDir();
|
||||||
static std::vector<std::string> sysConfigDirs();
|
static std::vector<std::string> sysConfigDirs();
|
||||||
@ -41,6 +41,7 @@ public:
|
|||||||
static std::vector<std::string> sysAppDirs();
|
static std::vector<std::string> sysAppDirs();
|
||||||
static std::vector<std::string> appDirs();
|
static std::vector<std::string> appDirs();
|
||||||
static std::vector<std::string> autoStartDirs();
|
static std::vector<std::string> autoStartDirs();
|
||||||
|
static std::string userAutoStartDir();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static void filterNotAbs(std::vector<std::string> &dirs);
|
static void filterNotAbs(std::vector<std::string> &dirs);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -34,52 +34,51 @@
|
|||||||
std::vector<std::string> DesktopInfo::currentDesktops;
|
std::vector<std::string> DesktopInfo::currentDesktops;
|
||||||
|
|
||||||
DesktopInfo::DesktopInfo(const std::string &_fileName)
|
DesktopInfo::DesktopInfo(const std::string &_fileName)
|
||||||
: kf(KeyFile())
|
: m_isValid(true)
|
||||||
, fileName(_fileName)
|
, m_keyFile(KeyFile())
|
||||||
, isValid(true)
|
|
||||||
{
|
{
|
||||||
if (!DString::endWith(fileName, ".desktop"))
|
std::string fileNameWithSuffix(_fileName);
|
||||||
fileName += ".desktop";
|
if (!DString::endWith(_fileName, ".desktop"))
|
||||||
|
fileNameWithSuffix += ".desktop";
|
||||||
|
|
||||||
if (!DFile::isAbs(fileName)) {
|
m_fileName = fileNameWithSuffix;
|
||||||
|
|
||||||
|
if (!DFile::isAbs(m_fileName)) {
|
||||||
// fileName是文件名,增加目录
|
// fileName是文件名,增加目录
|
||||||
bool isExisted = false;
|
bool isExisted = false;
|
||||||
for (const auto &dir : BaseDir::appDirs()) {
|
for (const auto &dir : BaseDir::appDirs()) {
|
||||||
fileName = dir + fileName;
|
m_fileName = dir + fileNameWithSuffix;
|
||||||
if (DFile::isExisted(fileName)) {
|
if (DFile::isExisted(m_fileName)) {
|
||||||
isExisted = true;
|
isExisted = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isExisted) {
|
if (!isExisted) {
|
||||||
isValid = false;
|
m_isValid = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
kf.loadFile(fileName);
|
m_keyFile.loadFile(m_fileName);
|
||||||
|
|
||||||
// check DesktopInfo valid
|
// check DesktopInfo valid
|
||||||
if (fileName.find(".desktop") == std::string::npos)
|
std::vector<std::string> mainKeys = m_keyFile.getMainKeys();
|
||||||
isValid = false;
|
|
||||||
|
|
||||||
std::vector<std::string> mainKeys = kf.getMainKeys();
|
|
||||||
if (mainKeys.size() == 0)
|
if (mainKeys.size() == 0)
|
||||||
isValid = false;
|
m_isValid = false;
|
||||||
|
|
||||||
bool found = std::any_of(mainKeys.begin(), mainKeys.end(),
|
bool found = std::any_of(mainKeys.begin(), mainKeys.end(),
|
||||||
[](const auto &key) {return key == MainSection;});
|
[](const auto &key) {return key == MainSection;});
|
||||||
|
|
||||||
if (!found)
|
if (!found)
|
||||||
isValid = false;
|
m_isValid = false;
|
||||||
|
|
||||||
if (kf.getStr(MainSection, KeyType) != TypeApplication)
|
if (m_keyFile.getStr(MainSection, KeyType) != TypeApplication)
|
||||||
isValid = false;
|
m_isValid = false;
|
||||||
|
|
||||||
name = kf.getLocaleStr(MainSection, KeyName, "");
|
m_name = m_keyFile.getLocaleStr(MainSection, KeyName, "");
|
||||||
icon = kf.getStr(MainSection, KeyIcon);
|
m_icon = m_keyFile.getStr(MainSection, KeyIcon);
|
||||||
id = getId();
|
m_id = getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
DesktopInfo::~DesktopInfo()
|
DesktopInfo::~DesktopInfo()
|
||||||
@ -89,12 +88,12 @@ DesktopInfo::~DesktopInfo()
|
|||||||
|
|
||||||
std::string DesktopInfo::getFileName()
|
std::string DesktopInfo::getFileName()
|
||||||
{
|
{
|
||||||
return fileName;
|
return m_fileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DesktopInfo::isValidDesktop()
|
bool DesktopInfo::isValidDesktop()
|
||||||
{
|
{
|
||||||
return isValid;
|
return m_isValid;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DesktopInfo::shouldShow()
|
bool DesktopInfo::shouldShow()
|
||||||
@ -108,12 +107,12 @@ bool DesktopInfo::shouldShow()
|
|||||||
|
|
||||||
bool DesktopInfo::getNoDisplay()
|
bool DesktopInfo::getNoDisplay()
|
||||||
{
|
{
|
||||||
return kf.getBool(MainSection, KeyNoDisplay);
|
return m_keyFile.getBool(MainSection, KeyNoDisplay);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DesktopInfo::getIsHidden()
|
bool DesktopInfo::getIsHidden()
|
||||||
{
|
{
|
||||||
return kf.getBool(MainSection, KeyHidden);
|
return m_keyFile.getBool(MainSection, KeyHidden);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DesktopInfo::getShowIn(std::vector<std::string> desktopEnvs)
|
bool DesktopInfo::getShowIn(std::vector<std::string> desktopEnvs)
|
||||||
@ -127,8 +126,8 @@ bool DesktopInfo::getShowIn(std::vector<std::string> desktopEnvs)
|
|||||||
desktopEnvs.assign(currentDesktops.begin(), currentDesktops.end());
|
desktopEnvs.assign(currentDesktops.begin(), currentDesktops.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> onlyShowIn = kf.getStrList(MainSection, KeyOnlyShowIn);
|
std::vector<std::string> onlyShowIn = m_keyFile.getStrList(MainSection, KeyOnlyShowIn);
|
||||||
std::vector<std::string> notShowIn = kf.getStrList(MainSection, KeyNotShowIn);
|
std::vector<std::string> notShowIn = m_keyFile.getStrList(MainSection, KeyNotShowIn);
|
||||||
|
|
||||||
for (const auto &desktop : desktopEnvs) {
|
for (const auto &desktop : desktopEnvs) {
|
||||||
bool ret = std::any_of(onlyShowIn.begin(), onlyShowIn.end(),
|
bool ret = std::any_of(onlyShowIn.begin(), onlyShowIn.end(),
|
||||||
@ -147,7 +146,7 @@ bool DesktopInfo::getShowIn(std::vector<std::string> desktopEnvs)
|
|||||||
|
|
||||||
std::string DesktopInfo::getExecutable()
|
std::string DesktopInfo::getExecutable()
|
||||||
{
|
{
|
||||||
return kf.getStr(MainSection, KeyExec);
|
return m_keyFile.getStr(MainSection, KeyExec);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DesktopInfo::isExecutableOk()
|
bool DesktopInfo::isExecutableOk()
|
||||||
@ -182,25 +181,31 @@ bool DesktopInfo::isExecutableOk()
|
|||||||
|
|
||||||
bool DesktopInfo::isInstalled()
|
bool DesktopInfo::isInstalled()
|
||||||
{
|
{
|
||||||
const char *name = fileName.c_str();
|
const char *name = m_fileName.c_str();
|
||||||
const char *found = strstr(name, "/applications/");
|
const char *found = strstr(name, "/applications/");
|
||||||
if (!found)
|
if (!found)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
auto appDirs = BaseDir::appDirs();
|
auto appDirs = BaseDir::appDirs();
|
||||||
return std::any_of(appDirs.begin(), appDirs.end(),
|
return std::any_of(appDirs.begin(), appDirs.end(),
|
||||||
[&name, &found] (std::string dir) -> bool {return strneq(dir.c_str(), name, size_t(found - name));});
|
[&name, &found] (std::string dir) -> bool {return strneq(dir.c_str(), name, size_t(found - name));});
|
||||||
|
}
|
||||||
|
|
||||||
|
// [Desktop Action new-window] or [Full_Screenshot Shortcut Group]
|
||||||
|
bool DesktopInfo::isDesktopAction(std::string name)
|
||||||
|
{
|
||||||
|
return DString::startWith(name.c_str(), "Desktop Action") || DString::endWith(name.c_str(), "Shortcut Group");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<DesktopAction> DesktopInfo::getActions()
|
std::vector<DesktopAction> DesktopInfo::getActions()
|
||||||
{
|
{
|
||||||
std::vector<DesktopAction> actions;
|
std::vector<DesktopAction> actions;
|
||||||
for (const auto &mainKey : kf.getMainKeys()) {
|
for (const auto &mainKey : m_keyFile.getMainKeys()) {
|
||||||
if (DString::startWith(mainKey, "Desktop Action")
|
if (DString::startWith(mainKey, "Desktop Action")
|
||||||
|| DString::endWith(mainKey, "Shortcut Group")) {
|
|| DString::endWith(mainKey, "Shortcut Group")) {
|
||||||
DesktopAction action;
|
DesktopAction action;
|
||||||
action.name = kf.getLocaleStr(mainKey, KeyName, "");
|
action.name = m_keyFile.getLocaleStr(mainKey, KeyName, "");
|
||||||
action.exec = kf.getStr(mainKey, KeyExec);
|
action.exec = m_keyFile.getStr(mainKey, KeyExec);
|
||||||
actions.push_back(action);
|
actions.push_back(action);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -225,10 +230,15 @@ DesktopInfo DesktopInfo::getDesktopInfoById(std::string appId)
|
|||||||
return DesktopInfo("");
|
return DesktopInfo("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DesktopInfo::getTerminal()
|
||||||
|
{
|
||||||
|
return m_keyFile.getBool(MainSection, KeyTerminal);
|
||||||
|
}
|
||||||
|
|
||||||
// TryExec is Path to an executable file on disk used to determine if the program is actually installed
|
// TryExec is Path to an executable file on disk used to determine if the program is actually installed
|
||||||
std::string DesktopInfo::getTryExec()
|
std::string DesktopInfo::getTryExec()
|
||||||
{
|
{
|
||||||
return kf.getStr(MainSection, KeyTryExec);
|
return m_keyFile.getStr(MainSection, KeyTryExec);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 按$PATH路径查找执行文件
|
// 按$PATH路径查找执行文件
|
||||||
@ -239,22 +249,26 @@ bool DesktopInfo::findExecutable(std::string &exec)
|
|||||||
return std::any_of(paths.begin(), paths.end(), [&exec](std::string path) {return DFile::isExisted(path + "/" +exec);});
|
return std::any_of(paths.begin(), paths.end(), [&exec](std::string path) {return DFile::isExisted(path + "/" +exec);});
|
||||||
}
|
}
|
||||||
|
|
||||||
// filename must has suffix desktopExt
|
/**
|
||||||
// example:
|
* @brief DesktopInfo::getId
|
||||||
// /usr/share/applications/a.desktop -> a
|
* filename must has suffix desktopExt
|
||||||
// /usr/share/applications/kde4/a.desktop -> kde4/a
|
* example:
|
||||||
// /xxxx/dir/a.desktop -> /xxxx/dir/a
|
* /usr/share/applications/a.desktop -> a
|
||||||
|
* /usr/share/applications/kde4/a.desktop -> kde4/a
|
||||||
|
* /xxxx/dir/a.desktop -> /xxxx/dir/a
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
std::string DesktopInfo::getId()
|
std::string DesktopInfo::getId()
|
||||||
{
|
{
|
||||||
if (!id.empty())
|
if (!m_id.empty())
|
||||||
return id;
|
return m_id;
|
||||||
|
|
||||||
std::string idStr;
|
std::string idStr;
|
||||||
auto const suffixPos = fileName.find(".desktop");
|
auto const suffixPos = m_fileName.find(".desktop");
|
||||||
if (suffixPos == std::string::npos)
|
if (suffixPos == std::string::npos)
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
idStr = fileName.substr(0, fileName.size() - 8); // trim suffix
|
idStr = m_fileName.substr(0, m_fileName.size() - 8); // trim suffix
|
||||||
size_t dirPos = idStr.find("/applications/");
|
size_t dirPos = idStr.find("/applications/");
|
||||||
if (dirPos == std::string::npos)
|
if (dirPos == std::string::npos)
|
||||||
return "";
|
return "";
|
||||||
@ -265,45 +279,55 @@ std::string DesktopInfo::getId()
|
|||||||
[&baseDir](const auto &dir) {return dir == baseDir;});
|
[&baseDir](const auto &dir) {return dir == baseDir;});
|
||||||
|
|
||||||
if (installed) {
|
if (installed) {
|
||||||
id = idStr.substr(baseDir.size(), idStr.size());
|
m_id = idStr.substr(baseDir.size(), idStr.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
return id;
|
return m_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string DesktopInfo::getGenericName()
|
std::string DesktopInfo::getGenericName()
|
||||||
{
|
{
|
||||||
return kf.getLocaleStr(MainSection, KeyGenericName, "");
|
return m_keyFile.getLocaleStr(MainSection, KeyGenericName, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string DesktopInfo::getName()
|
std::string DesktopInfo::getName()
|
||||||
{
|
{
|
||||||
return name;
|
return m_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string DesktopInfo::getIcon()
|
std::string DesktopInfo::getIcon()
|
||||||
{
|
{
|
||||||
return icon;
|
return m_icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string DesktopInfo::getCommandLine()
|
std::string DesktopInfo::getCommandLine()
|
||||||
{
|
{
|
||||||
return kf.getStr(MainSection, KeyExec);
|
return m_keyFile.getStr(MainSection, KeyExec);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> DesktopInfo::getKeywords()
|
std::vector<std::string> DesktopInfo::getKeywords()
|
||||||
{
|
{
|
||||||
return kf.getLocaleStrList(MainSection, KeyKeywords, "");
|
return m_keyFile.getLocaleStrList(MainSection, KeyKeywords, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> DesktopInfo::getCategories()
|
std::vector<std::string> DesktopInfo::getCategories()
|
||||||
{
|
{
|
||||||
return kf.getStrList(MainSection, KeyCategories);
|
return m_keyFile.getStrList(MainSection, KeyCategories);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DesktopInfo::setDesktopOverrideExec(const std::string &execStr)
|
||||||
|
{
|
||||||
|
m_overRideExec = execStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
KeyFile *DesktopInfo::getKeyFile()
|
||||||
|
{
|
||||||
|
return &m_keyFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
// class AppsDir
|
// class AppsDir
|
||||||
AppsDir::AppsDir(const std::string &dirPath)
|
AppsDir::AppsDir(const std::string &dirPath)
|
||||||
: path(dirPath)
|
: m_path(dirPath)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -315,7 +339,7 @@ AppsDir::~AppsDir()
|
|||||||
|
|
||||||
std::string AppsDir::getPath()
|
std::string AppsDir::getPath()
|
||||||
{
|
{
|
||||||
return path;
|
return m_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -325,11 +349,10 @@ std::map<std::string, bool> AppsDir::getAppNames()
|
|||||||
DIR* dp;
|
DIR* dp;
|
||||||
struct dirent* ep;
|
struct dirent* ep;
|
||||||
|
|
||||||
dp = opendir(path.c_str());
|
dp = opendir(m_path.c_str());
|
||||||
if (dp == nullptr)
|
if (!dp) {
|
||||||
{
|
std::cout << "Couldn't open directory " << m_path << std::endl;
|
||||||
std::cout << "Couldn't open directory " << path << std::endl;
|
return m_appNames;
|
||||||
return appNames;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((ep = readdir(dp))) {
|
while ((ep = readdir(dp))) {
|
||||||
@ -339,11 +362,11 @@ std::map<std::string, bool> AppsDir::getAppNames()
|
|||||||
if (!DString::endWith(ep->d_name, ".desktop"))
|
if (!DString::endWith(ep->d_name, ".desktop"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
appNames.insert({ep->d_name, true});
|
m_appNames.insert({ep->d_name, true});
|
||||||
}
|
}
|
||||||
closedir(dp);
|
closedir(dp);
|
||||||
|
|
||||||
return appNames;
|
return m_appNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取所有应用信息
|
// 获取所有应用信息
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -57,7 +57,14 @@ const std::string TypeDirectory = "Directory";
|
|||||||
|
|
||||||
const std::string envDesktopEnv = "XDG_CURRENT_DESKTOP";
|
const std::string envDesktopEnv = "XDG_CURRENT_DESKTOP";
|
||||||
|
|
||||||
typedef struct DesktopAction {
|
typedef struct DesktopAction
|
||||||
|
{
|
||||||
|
DesktopAction()
|
||||||
|
: section("")
|
||||||
|
, name("")
|
||||||
|
, exec("")
|
||||||
|
{
|
||||||
|
}
|
||||||
std::string section;
|
std::string section;
|
||||||
std::string name;
|
std::string name;
|
||||||
std::string exec;
|
std::string exec;
|
||||||
@ -78,8 +85,10 @@ public:
|
|||||||
bool getShowIn(std::vector<std::string> desktopEnvs);
|
bool getShowIn(std::vector<std::string> desktopEnvs);
|
||||||
bool isExecutableOk();
|
bool isExecutableOk();
|
||||||
bool isInstalled();
|
bool isInstalled();
|
||||||
|
static bool isDesktopAction(std::string name);
|
||||||
std::vector<DesktopAction> getActions();
|
std::vector<DesktopAction> getActions();
|
||||||
static DesktopInfo getDesktopInfoById(std::string appId);
|
static DesktopInfo getDesktopInfoById(std::string appId);
|
||||||
|
bool getTerminal();
|
||||||
|
|
||||||
std::string getId();
|
std::string getId();
|
||||||
std::string getGenericName();
|
std::string getGenericName();
|
||||||
@ -88,19 +97,23 @@ public:
|
|||||||
std::string getCommandLine();
|
std::string getCommandLine();
|
||||||
std::vector<std::string> getKeywords();
|
std::vector<std::string> getKeywords();
|
||||||
std::vector<std::string> getCategories();
|
std::vector<std::string> getCategories();
|
||||||
|
void setDesktopOverrideExec(const std::string &execStr);
|
||||||
|
|
||||||
KeyFile kf;
|
KeyFile *getKeyFile();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string getTryExec();
|
std::string getTryExec();
|
||||||
bool findExecutable(std::string &exec);
|
bool findExecutable(std::string &exec);
|
||||||
std::string fileName;
|
|
||||||
std::string id;
|
|
||||||
std::string name;
|
|
||||||
std::string icon;
|
|
||||||
std::string overRideExec;
|
|
||||||
bool isValid;
|
|
||||||
static std::vector<std::string> currentDesktops;
|
static std::vector<std::string> currentDesktops;
|
||||||
|
|
||||||
|
std::string m_fileName;
|
||||||
|
std::string m_id;
|
||||||
|
std::string m_name;
|
||||||
|
std::string m_icon;
|
||||||
|
std::string m_overRideExec;
|
||||||
|
bool m_isValid;
|
||||||
|
KeyFile m_keyFile;
|
||||||
};
|
};
|
||||||
|
|
||||||
// 应用目录类
|
// 应用目录类
|
||||||
@ -114,8 +127,8 @@ public:
|
|||||||
static std::vector<DesktopInfo> getAllDesktopInfos();
|
static std::vector<DesktopInfo> getAllDesktopInfos();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string path;
|
std::string m_path;
|
||||||
std::map<std::string, bool> appNames;
|
std::map<std::string, bool> m_appNames;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DESKTOPINFO_H
|
#endif // DESKTOPINFO_H
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -38,7 +38,7 @@ const char charAt = '@';
|
|||||||
|
|
||||||
Locale::Locale()
|
Locale::Locale()
|
||||||
{
|
{
|
||||||
pthread_mutex_init(&languageNames.mutex, nullptr);
|
pthread_mutex_init(&m_languageNames.mutex, nullptr);
|
||||||
|
|
||||||
// init aliases
|
// init aliases
|
||||||
FILE *fp = fopen(aliasFile, "r");
|
FILE *fp = fopen(aliasFile, "r");
|
||||||
@ -74,15 +74,18 @@ Locale::Locale()
|
|||||||
parts = DString::splitStr(line, '\t');
|
parts = DString::splitStr(line, '\t');
|
||||||
|
|
||||||
if (parts.size() == 2) {
|
if (parts.size() == 2) {
|
||||||
aliases[parts[0]] = parts[1];
|
m_aliases[parts[0]] = parts[1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// wayland environment is useful?
|
/**
|
||||||
// ExplodeLocale Break an X/Open style locale specification into components
|
* @brief Locale::explodeLocale 拆分locale
|
||||||
|
* @param locale
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
Locale::Components Locale::explodeLocale(std::string locale)
|
Locale::Components Locale::explodeLocale(std::string locale)
|
||||||
{
|
{
|
||||||
Components cmp;
|
Components cmp;
|
||||||
@ -146,19 +149,16 @@ std::string Locale::guessCategoryValue(std::string categoryName)
|
|||||||
|
|
||||||
std::string Locale::unaliasLang(std::string lang)
|
std::string Locale::unaliasLang(std::string lang)
|
||||||
{
|
{
|
||||||
if (aliases.find(lang) != aliases.end())
|
if (m_aliases.find(lang) != m_aliases.end())
|
||||||
return aliases[lang];
|
return m_aliases[lang];
|
||||||
else
|
else
|
||||||
return lang;
|
return lang;
|
||||||
}
|
}
|
||||||
|
|
||||||
// wayland environment is useful?
|
/**
|
||||||
/*
|
* @brief Locale::getLocaleVariants
|
||||||
* Compute all interesting variants for a given locale name -
|
* @param locale
|
||||||
* by stripping off different components of the value.
|
* @return
|
||||||
*
|
|
||||||
* For simplicity, we assume that the locale is in
|
|
||||||
* X/Open format: language[_territory][.codeset][@modifier]
|
|
||||||
*/
|
*/
|
||||||
std::vector<std::string> Locale::getLocaleVariants(const std::string &locale)
|
std::vector<std::string> Locale::getLocaleVariants(const std::string &locale)
|
||||||
{
|
{
|
||||||
@ -192,19 +192,19 @@ std::vector<std::string> Locale::getLanguageNames()
|
|||||||
return names;
|
return names;
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&languageNames.mutex);
|
pthread_mutex_lock(&m_languageNames.mutex);
|
||||||
if (languageNames.language != value) {
|
if (m_languageNames.language != value) {
|
||||||
languageNames.language = value;
|
m_languageNames.language = value;
|
||||||
languageNames.names.clear();
|
m_languageNames.names.clear();
|
||||||
std::vector<std::string> langs = DString::splitStr(value, ':');
|
std::vector<std::string> langs = DString::splitStr(value, ':');
|
||||||
for (const auto & lang : langs) {
|
for (const auto & lang : langs) {
|
||||||
std::vector<std::string> localeVariant = getLocaleVariants(unaliasLang(lang));
|
std::vector<std::string> localeVariant = getLocaleVariants(unaliasLang(lang));
|
||||||
for (const auto & var : localeVariant)
|
for (const auto & var : localeVariant)
|
||||||
languageNames.names.push_back(var);
|
m_languageNames.names.push_back(var);
|
||||||
}
|
}
|
||||||
languageNames.names.push_back("C");
|
m_languageNames.names.push_back("C");
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&languageNames.mutex);
|
pthread_mutex_unlock(&m_languageNames.mutex);
|
||||||
|
|
||||||
return languageNames.names;
|
return m_languageNames.names;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -59,8 +59,8 @@ private:
|
|||||||
Components explodeLocale(std::string locale);
|
Components explodeLocale(std::string locale);
|
||||||
std::string guessCategoryValue(std::string categoryName);
|
std::string guessCategoryValue(std::string categoryName);
|
||||||
std::string unaliasLang(std::string);
|
std::string unaliasLang(std::string);
|
||||||
std::map<std::string, std::string> aliases;
|
std::map<std::string, std::string> m_aliases;
|
||||||
LanguageNameCache languageNames;
|
LanguageNameCache m_languageNames;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
85
src/lib/gsetting.cpp
Normal file
85
src/lib/gsetting.cpp
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
#include "gsetting.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
GSetting::GSetting(std::string settings)
|
||||||
|
: m_gs(nullptr)
|
||||||
|
, m_settings(settings)
|
||||||
|
{
|
||||||
|
m_gs = g_settings_new(m_settings.c_str());
|
||||||
|
if (!m_gs) {
|
||||||
|
std::cout << "GSetting: g_settings_new error" << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GSetting::~GSetting()
|
||||||
|
{
|
||||||
|
if (m_gs) {
|
||||||
|
g_object_unref(m_gs);
|
||||||
|
m_gs = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string GSetting::getString(std::string key)
|
||||||
|
{
|
||||||
|
std::string ret;
|
||||||
|
if (m_gs) {
|
||||||
|
ret = g_settings_get_string(m_gs, key.c_str());
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GSetting::setString(std::string key, std::string value)
|
||||||
|
{
|
||||||
|
if (m_gs) {
|
||||||
|
g_settings_set_string(m_gs, key.c_str(), value.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int GSetting::getInt(std::string key)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
if (m_gs) {
|
||||||
|
ret = g_settings_get_int(m_gs, key.c_str());
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GSetting::setInt(std::string key, int value)
|
||||||
|
{
|
||||||
|
if (m_gs) {
|
||||||
|
g_settings_set_int(m_gs, key.c_str(), value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
double GSetting::getDouble(std::string key)
|
||||||
|
{
|
||||||
|
double ret = 0;
|
||||||
|
if (m_gs) {
|
||||||
|
ret = g_settings_get_double(m_gs, key.c_str());
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GSetting::setDouble(std::string key, double value)
|
||||||
|
{
|
||||||
|
if (m_gs) {
|
||||||
|
g_settings_set_double(m_gs, key.c_str(), value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GSetting::getBool(std::string key)
|
||||||
|
{
|
||||||
|
bool ret = false;
|
||||||
|
if (m_gs) {
|
||||||
|
ret = g_settings_get_boolean(m_gs, key.c_str());
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GSetting::setBool(std::string key, bool value)
|
||||||
|
{
|
||||||
|
if (m_gs) {
|
||||||
|
g_settings_set_double(m_gs, key.c_str(), value);
|
||||||
|
}
|
||||||
|
}
|
30
src/lib/gsetting.h
Normal file
30
src/lib/gsetting.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#ifndef GSETTING_H
|
||||||
|
#define GSETTING_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <gio/gio.h>
|
||||||
|
|
||||||
|
class GSetting
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit GSetting(std::string settings);
|
||||||
|
~GSetting();
|
||||||
|
|
||||||
|
std::string getString(std::string key);
|
||||||
|
void setString(std::string key, std::string value);
|
||||||
|
|
||||||
|
int getInt(std::string key);
|
||||||
|
void setInt(std::string key, int value);
|
||||||
|
|
||||||
|
double getDouble(std::string key);
|
||||||
|
void setDouble(std::string key, double value);
|
||||||
|
|
||||||
|
bool getBool(std::string key);
|
||||||
|
void setBool(std::string key, bool value);
|
||||||
|
|
||||||
|
private:
|
||||||
|
GSettings *m_gs;
|
||||||
|
std::string m_settings;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // GSETTING_H
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -29,26 +29,26 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
KeyFile::KeyFile(char separtor)
|
KeyFile::KeyFile(char separtor)
|
||||||
: fp(nullptr)
|
: m_fp(nullptr)
|
||||||
, modified(false)
|
, m_modified(false)
|
||||||
, listSeparator(separtor)
|
, m_listSeparator(separtor)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyFile::~KeyFile()
|
KeyFile::~KeyFile()
|
||||||
{
|
{
|
||||||
if (fp) {
|
if (m_fp) {
|
||||||
fclose(fp);
|
fclose(m_fp);
|
||||||
fp = nullptr;
|
m_fp = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KeyFile::getBool(const std::string §ion, const std::string &key, bool defaultValue)
|
bool KeyFile::getBool(const std::string §ion, const std::string &key, bool defaultValue)
|
||||||
{
|
{
|
||||||
if (mainKeyMap.find(section) == mainKeyMap.end())
|
if (m_mainKeyMap.find(section) == m_mainKeyMap.end())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
std::string valueStr = mainKeyMap[section][key];
|
std::string valueStr = m_mainKeyMap[section][key];
|
||||||
bool value = defaultValue;
|
bool value = defaultValue;
|
||||||
if (valueStr == "true")
|
if (valueStr == "true")
|
||||||
value = true;
|
value = true;
|
||||||
@ -58,6 +58,14 @@ bool KeyFile::getBool(const std::string §ion, const std::string &key, bool d
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void KeyFile::setBool(const std::string §ion, const std::string &key, const std::string &defaultValue)
|
||||||
|
{
|
||||||
|
if (m_mainKeyMap.find(section) == m_mainKeyMap.end())
|
||||||
|
m_mainKeyMap.insert({section, KeyMap()});
|
||||||
|
|
||||||
|
m_mainKeyMap[section][key] = defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
std::vector<bool> KeyFile::getBoolList(const std::string §ion, const std::string &key, bool defaultValue)
|
std::vector<bool> KeyFile::getBoolList(const std::string §ion, const std::string &key, bool defaultValue)
|
||||||
{
|
{
|
||||||
@ -67,10 +75,10 @@ std::vector<bool> KeyFile::getBoolList(const std::string §ion, const std::st
|
|||||||
|
|
||||||
int KeyFile::getInt(const std::string §ion, const std::string &key, int defaultValue)
|
int KeyFile::getInt(const std::string §ion, const std::string &key, int defaultValue)
|
||||||
{
|
{
|
||||||
if (mainKeyMap.find(section) == mainKeyMap.end())
|
if (m_mainKeyMap.find(section) == m_mainKeyMap.end())
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
|
|
||||||
std::string valueStr = mainKeyMap[section][key];
|
std::string valueStr = m_mainKeyMap[section][key];
|
||||||
int value;
|
int value;
|
||||||
try {
|
try {
|
||||||
value = std::stoi(valueStr);
|
value = std::stoi(valueStr);
|
||||||
@ -94,6 +102,12 @@ int64_t KeyFile::getInt64(const std::string §ion, const std::string &key, in
|
|||||||
return int64_t(0);
|
return int64_t(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
uint64_t KeyFile::getUint64(const std::string §ion, const std::string &key, int64_t defaultValue)
|
||||||
|
{
|
||||||
|
return uint64_t(0);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
float KeyFile::getFloat(const std::string §ion, const std::string &key, float defaultValue)
|
float KeyFile::getFloat(const std::string §ion, const std::string &key, float defaultValue)
|
||||||
{
|
{
|
||||||
@ -102,10 +116,10 @@ float KeyFile::getFloat(const std::string §ion, const std::string &key, floa
|
|||||||
|
|
||||||
std::string KeyFile::getStr(const std::string §ion, const std::string &key, std::string defaultValue)
|
std::string KeyFile::getStr(const std::string §ion, const std::string &key, std::string defaultValue)
|
||||||
{
|
{
|
||||||
if (mainKeyMap.find(section) == mainKeyMap.end())
|
if (m_mainKeyMap.find(section) == m_mainKeyMap.end())
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
|
|
||||||
std::string valueStr = mainKeyMap[section][key];
|
std::string valueStr = m_mainKeyMap[section][key];
|
||||||
if (valueStr.empty())
|
if (valueStr.empty())
|
||||||
valueStr = defaultValue;
|
valueStr = defaultValue;
|
||||||
|
|
||||||
@ -114,10 +128,10 @@ std::string KeyFile::getStr(const std::string §ion, const std::string &key,
|
|||||||
|
|
||||||
bool KeyFile::containKey(const std::string §ion, const std::string &key)
|
bool KeyFile::containKey(const std::string §ion, const std::string &key)
|
||||||
{
|
{
|
||||||
if (mainKeyMap.find(section) == mainKeyMap.end())
|
if (m_mainKeyMap.find(section) == m_mainKeyMap.end())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return mainKeyMap[section].find(key) != mainKeyMap[section].end();
|
return m_mainKeyMap[section].find(key) != m_mainKeyMap[section].end();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string KeyFile::getLocaleStr(const std::string §ion, const std::string &key, std::string defaultLocale)
|
std::string KeyFile::getLocaleStr(const std::string §ion, const std::string &key, std::string defaultLocale)
|
||||||
@ -141,7 +155,7 @@ std::string KeyFile::getLocaleStr(const std::string §ion, const std::string
|
|||||||
std::vector<std::string> KeyFile::getStrList(const std::string §ion, const std::string &key)
|
std::vector<std::string> KeyFile::getStrList(const std::string §ion, const std::string &key)
|
||||||
{
|
{
|
||||||
std::string value = getStr(section, key);
|
std::string value = getStr(section, key);
|
||||||
return DString::splitStr(value, listSeparator);
|
return DString::splitStr(value, m_listSeparator);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> KeyFile::getLocaleStrList(const std::string §ion, const std::string &key, std::string defaultLocale)
|
std::vector<std::string> KeyFile::getLocaleStrList(const std::string §ion, const std::string &key, std::string defaultLocale)
|
||||||
@ -164,10 +178,10 @@ std::vector<std::string> KeyFile::getLocaleStrList(const std::string §ion, c
|
|||||||
// 修改keyfile内容
|
// 修改keyfile内容
|
||||||
void KeyFile::setKey(const std::string §ion, const std::string &key, const std::string &value)
|
void KeyFile::setKey(const std::string §ion, const std::string &key, const std::string &value)
|
||||||
{
|
{
|
||||||
if (mainKeyMap.find(section) == mainKeyMap.end())
|
if (m_mainKeyMap.find(section) == m_mainKeyMap.end())
|
||||||
mainKeyMap.insert({section, KeyMap()});
|
m_mainKeyMap.insert({section, KeyMap()});
|
||||||
|
|
||||||
mainKeyMap[section].insert({key, value});
|
m_mainKeyMap[section][key] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 写入文件
|
// 写入文件
|
||||||
@ -178,7 +192,7 @@ bool KeyFile::saveToFile(const std::string &filePath)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
||||||
for (const auto &im : mainKeyMap) {
|
for (const auto &im : m_mainKeyMap) {
|
||||||
const auto &keyMap = im.second;
|
const auto &keyMap = im.second;
|
||||||
std::string section = "[" + im.first + "]\n";
|
std::string section = "[" + im.first + "]\n";
|
||||||
fputs(section.c_str(), sfp);
|
fputs(section.c_str(), sfp);
|
||||||
@ -194,19 +208,19 @@ bool KeyFile::saveToFile(const std::string &filePath)
|
|||||||
|
|
||||||
bool KeyFile::loadFile(const std::string &filePath)
|
bool KeyFile::loadFile(const std::string &filePath)
|
||||||
{
|
{
|
||||||
mainKeyMap.clear();
|
m_mainKeyMap.clear();
|
||||||
if (fp) {
|
if (m_fp) {
|
||||||
fclose(fp);
|
fclose(m_fp);
|
||||||
fp = nullptr;
|
m_fp = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string lastSection;
|
std::string lastSection;
|
||||||
fp = fopen(filePath.data(), "r");
|
m_fp = fopen(filePath.data(), "r");
|
||||||
if (!fp)
|
if (!m_fp)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
char line[MAX_LINE_LEN] = {0};
|
char line[MAX_LINE_LEN] = {0};
|
||||||
while (fgets(line, MAX_LINE_LEN, fp)) {
|
while (fgets(line, MAX_LINE_LEN, m_fp)) {
|
||||||
char *start = &line[0];
|
char *start = &line[0];
|
||||||
char *end = start;
|
char *end = start;
|
||||||
while (!strneq(end, "\0", 1))
|
while (!strneq(end, "\0", 1))
|
||||||
@ -232,7 +246,7 @@ bool KeyFile::loadFile(const std::string &filePath)
|
|||||||
if (lPos && rPos && rPos - lPos > 0 && lPos == start && rPos == end) {
|
if (lPos && rPos && rPos - lPos > 0 && lPos == start && rPos == end) {
|
||||||
// 主键
|
// 主键
|
||||||
std::string section(lPos + 1, size_t(rPos - lPos - 1));
|
std::string section(lPos + 1, size_t(rPos - lPos - 1));
|
||||||
mainKeyMap.insert({section, KeyMap()});
|
m_mainKeyMap.insert({section, KeyMap()});
|
||||||
lastSection = section;
|
lastSection = section;
|
||||||
} else {
|
} else {
|
||||||
char *equal = strchr(start, '=');
|
char *equal = strchr(start, '=');
|
||||||
@ -248,7 +262,7 @@ bool KeyFile::loadFile(const std::string &filePath)
|
|||||||
// 子键
|
// 子键
|
||||||
std::string key(start, size_t(equal - start));
|
std::string key(start, size_t(equal - start));
|
||||||
std::string value(equal + 1, size_t(end - equal));
|
std::string value(equal + 1, size_t(end - equal));
|
||||||
for (auto &iter : mainKeyMap) {
|
for (auto &iter : m_mainKeyMap) {
|
||||||
if (iter.first != lastSection)
|
if (iter.first != lastSection)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -256,8 +270,9 @@ bool KeyFile::loadFile(const std::string &filePath)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(fp);
|
fclose(m_fp);
|
||||||
fp = nullptr;
|
m_fp = nullptr;
|
||||||
|
m_filePath = filePath;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -265,7 +280,7 @@ bool KeyFile::loadFile(const std::string &filePath)
|
|||||||
std::vector<std::string> KeyFile::getMainKeys()
|
std::vector<std::string> KeyFile::getMainKeys()
|
||||||
{
|
{
|
||||||
std::vector<std::string> mainKeys;
|
std::vector<std::string> mainKeys;
|
||||||
for (const auto &iter : mainKeyMap)
|
for (const auto &iter : m_mainKeyMap)
|
||||||
mainKeys.push_back(iter.first);
|
mainKeys.push_back(iter.first);
|
||||||
|
|
||||||
return mainKeys;
|
return mainKeys;
|
||||||
@ -274,7 +289,7 @@ std::vector<std::string> KeyFile::getMainKeys()
|
|||||||
void KeyFile::print()
|
void KeyFile::print()
|
||||||
{
|
{
|
||||||
std::cout << "sectionMap: " << std::endl;
|
std::cout << "sectionMap: " << std::endl;
|
||||||
for (auto sectionMap : mainKeyMap) {
|
for (auto sectionMap : m_mainKeyMap) {
|
||||||
std::cout << "section=" << sectionMap.first << std::endl;
|
std::cout << "section=" << sectionMap.first << std::endl;
|
||||||
KeyMap keyMap = sectionMap.second;
|
KeyMap keyMap = sectionMap.second;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -37,10 +37,12 @@ public:
|
|||||||
~KeyFile();
|
~KeyFile();
|
||||||
|
|
||||||
bool getBool(const std::string §ion, const std::string &key, bool defaultValue = false);
|
bool getBool(const std::string §ion, const std::string &key, bool defaultValue = false);
|
||||||
|
void setBool(const std::string §ion, const std::string &key, const std::string &defaultValue = "false");
|
||||||
std::vector<bool> getBoolList(const std::string §ion, const std::string &key, bool defaultValue = false);
|
std::vector<bool> getBoolList(const std::string §ion, const std::string &key, bool defaultValue = false);
|
||||||
int getInt(const std::string §ion, const std::string &key, int defaultValue = 0);
|
int getInt(const std::string §ion, const std::string &key, int defaultValue = 0);
|
||||||
std::vector<int> getIntList(const std::string §ion, const std::string &key, int defaultValue = 0);
|
std::vector<int> getIntList(const std::string §ion, const std::string &key, int defaultValue = 0);
|
||||||
int64_t getInt64(const std::string §ion, const std::string &key, int64_t defaultValue = 0);
|
int64_t getInt64(const std::string §ion, const std::string &key, int64_t defaultValue = 0);
|
||||||
|
uint64_t getUint64(const std::string §ion, const std::string &key, int64_t defaultValue = 0);
|
||||||
float getFloat(const std::string §ion, const std::string &key, float defaultValue = 0);
|
float getFloat(const std::string §ion, const std::string &key, float defaultValue = 0);
|
||||||
std::string getStr(const std::string §ion, const std::string &key, std::string defaultValue = "");
|
std::string getStr(const std::string §ion, const std::string &key, std::string defaultValue = "");
|
||||||
bool containKey(const std::string §ion, const std::string &key);
|
bool containKey(const std::string §ion, const std::string &key);
|
||||||
@ -57,11 +59,11 @@ public:
|
|||||||
void print();
|
void print();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MainKeyMap mainKeyMap; // section -> key : value
|
MainKeyMap m_mainKeyMap; // section -> key : value
|
||||||
std::string filePath;
|
std::string m_filePath;
|
||||||
FILE *fp;
|
FILE *m_fp;
|
||||||
bool modified;
|
bool m_modified;
|
||||||
char listSeparator;
|
char m_listSeparator;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // KEYFILE_H
|
#endif // KEYFILE_H
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
91
src/lib/meminfo.cpp
Normal file
91
src/lib/meminfo.cpp
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
|
*
|
||||||
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* Maintainer: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "meminfo.h"
|
||||||
|
#include "macro.h"
|
||||||
|
#include "dstring.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
MemInfo::MemInfo()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
MemoryInfo MemInfo::getMemoryInfo()
|
||||||
|
{
|
||||||
|
MemoryInfo ret;
|
||||||
|
FILE *fp = fopen("/proc/meminfo", "r");
|
||||||
|
if (!fp)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
char line[MAX_LINE_LEN] = {0};
|
||||||
|
while (fgets(line, MAX_LINE_LEN, fp)) {
|
||||||
|
std::string info(line);
|
||||||
|
std::vector<std::string> parts = DString::splitStr(info, ':');
|
||||||
|
if (parts.size() != 2)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
uint64_t num = std::stoll(parts[1]);
|
||||||
|
if (parts[0] == "MemTotal") {
|
||||||
|
ret.memTotal = num;
|
||||||
|
} else if (parts[0] == "MemFree") {
|
||||||
|
ret.memFree = num;
|
||||||
|
} else if (parts[0] == "MemAvailable") {
|
||||||
|
ret.memAvailable = num;
|
||||||
|
} else if (parts[0] == "Buffers") {
|
||||||
|
ret.buffers = num;
|
||||||
|
} else if (parts[0] == "Cached") {
|
||||||
|
ret.cached = num;
|
||||||
|
} else if (parts[0] == "SwapTotal") {
|
||||||
|
ret.swapTotal = num;
|
||||||
|
} else if (parts[0] == "SwapFree") {
|
||||||
|
ret.swapFree = num;
|
||||||
|
} else if (parts[0] == "SwapCached") {
|
||||||
|
ret.swapCached = num;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSufficient check the memory whether reaches the qualified value
|
||||||
|
bool MemInfo::isSufficient(uint64_t minMemAvail, uint64_t maxSwapUsed)
|
||||||
|
{
|
||||||
|
if (minMemAvail == 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
MemoryInfo info = getMemoryInfo();
|
||||||
|
uint64_t used = info.swapTotal - info.swapFree - info.swapCached;
|
||||||
|
|
||||||
|
if (info.memAvailable < minMemAvail)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (maxSwapUsed == 0 || info.memAvailable > used)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return used < maxSwapUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
50
src/lib/meminfo.h
Normal file
50
src/lib/meminfo.h
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
|
*
|
||||||
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* Maintainer: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MEMINFO_H
|
||||||
|
#define MEMINFO_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
// MemoryInfo show the current memory stat, sum by kb
|
||||||
|
struct MemoryInfo
|
||||||
|
{
|
||||||
|
uint64_t memTotal;
|
||||||
|
uint64_t memFree;
|
||||||
|
uint64_t memAvailable;
|
||||||
|
uint64_t buffers;
|
||||||
|
uint64_t cached;
|
||||||
|
uint64_t swapTotal;
|
||||||
|
uint64_t swapFree;
|
||||||
|
uint64_t swapCached;
|
||||||
|
};
|
||||||
|
|
||||||
|
class MemInfo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MemInfo();
|
||||||
|
|
||||||
|
static MemoryInfo getMemoryInfo();
|
||||||
|
|
||||||
|
static bool isSufficient(uint64_t minMemAvail, uint64_t maxSwapUsed);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MEMINFO_H
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -31,80 +31,80 @@
|
|||||||
#define FILECONTENLEN 2048
|
#define FILECONTENLEN 2048
|
||||||
|
|
||||||
Process::Process()
|
Process::Process()
|
||||||
: pid(0)
|
: m_pid(0)
|
||||||
, ppid(0)
|
, m_ppid(0)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Process::Process(int _pid)
|
Process::Process(int _pid)
|
||||||
: pid(_pid)
|
: m_pid(_pid)
|
||||||
, ppid(0)
|
, m_ppid(0)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Process::isExist()
|
bool Process::isExist()
|
||||||
{
|
{
|
||||||
std::string procDir = "/proc/" + std::to_string(pid);
|
std::string procDir = "/proc/" + std::to_string(m_pid);
|
||||||
return DFile::isExisted(procDir);
|
return DFile::isExisted(procDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> Process::getCmdLine()
|
std::vector<std::string> Process::getCmdLine()
|
||||||
{
|
{
|
||||||
if (cmdLine.size() == 0) {
|
if (m_cmdLine.size() == 0) {
|
||||||
std::string cmdlineFile = getFile("cmdline");
|
std::string cmdlineFile = getFile("cmdline");
|
||||||
cmdLine = readFile(cmdlineFile);
|
m_cmdLine = readFile(cmdlineFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
return cmdLine;
|
return m_cmdLine;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Process::getCwd()
|
std::string Process::getCwd()
|
||||||
{
|
{
|
||||||
if (cwd.empty()) {
|
if (m_cwd.empty()) {
|
||||||
std::string cwdFile = getFile("cwd");
|
std::string cwdFile = getFile("cwd");
|
||||||
char path[MAX_FILEPATH_LEN] = {};
|
char path[MAX_FILEPATH_LEN] = {};
|
||||||
ssize_t len = readlink(cwdFile.c_str(), path, MAX_FILEPATH_LEN);
|
ssize_t len = readlink(cwdFile.c_str(), path, MAX_FILEPATH_LEN);
|
||||||
if (len > 0 && len < MAX_FILEPATH_LEN) {
|
if (len > 0 && len < MAX_FILEPATH_LEN) {
|
||||||
cwd = std::string(path) + "/";
|
m_cwd = std::string(path) + "/";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return cwd;
|
return m_cwd;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Process::getExe()
|
std::string Process::getExe()
|
||||||
{
|
{
|
||||||
if (exe.empty()) {
|
if (m_exe.empty()) {
|
||||||
std::string cmdLineFile = getFile("exe");
|
std::string cmdLineFile = getFile("exe");
|
||||||
char path[MAX_FILEPATH_LEN] = {};
|
char path[MAX_FILEPATH_LEN] = {};
|
||||||
ssize_t len = readlink(cmdLineFile.c_str(), path, MAX_FILEPATH_LEN);
|
ssize_t len = readlink(cmdLineFile.c_str(), path, MAX_FILEPATH_LEN);
|
||||||
if (len > 0 && len < MAX_FILEPATH_LEN) {
|
if (len > 0 && len < MAX_FILEPATH_LEN) {
|
||||||
exe = std::string(path);
|
m_exe = std::string(path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return exe;
|
return m_exe;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::string> Process::getEnviron()
|
std::vector<std::string> Process::getEnviron()
|
||||||
{
|
{
|
||||||
if (environ.size() == 0) {
|
if (m_environ.size() == 0) {
|
||||||
std::string envFile = getFile("environ");
|
std::string envFile = getFile("environ");
|
||||||
environ = readFile(envFile);
|
m_environ = readFile(envFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
return environ;
|
return m_environ;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Process::getEnv(const std::string &key)
|
std::string Process::getEnv(const std::string &key)
|
||||||
{
|
{
|
||||||
if (environ.size() == 0)
|
if (m_environ.size() == 0)
|
||||||
environ = getEnviron();
|
m_environ = getEnviron();
|
||||||
|
|
||||||
std::string keyPrefix = key + "=";
|
std::string keyPrefix = key + "=";
|
||||||
for (auto & env : environ) {
|
for (auto & env : m_environ) {
|
||||||
if (DString::startWith(env, keyPrefix)) {
|
if (DString::startWith(env, keyPrefix)) {
|
||||||
ulong len = keyPrefix.size();
|
ulong len = keyPrefix.size();
|
||||||
return env.substr(len, env.size() - len);
|
return env.substr(len, env.size() - len);
|
||||||
@ -116,59 +116,59 @@ std::string Process::getEnv(const std::string &key)
|
|||||||
|
|
||||||
Status Process::getStatus()
|
Status Process::getStatus()
|
||||||
{
|
{
|
||||||
if (status.size() == 0) {
|
if (m_status.size() == 0) {
|
||||||
std::string statusFile = getFile("status");
|
std::string statusFile = getFile("status");
|
||||||
FILE *fp = fopen(statusFile.c_str(), "r");
|
FILE *fp = fopen(statusFile.c_str(), "r");
|
||||||
if (!fp)
|
if (!fp)
|
||||||
return status;
|
return m_status;
|
||||||
|
|
||||||
char line[MAX_LINE_LEN] = {0};
|
char line[MAX_LINE_LEN] = {0};
|
||||||
while (fgets(line, MAX_LINE_LEN, fp)) {
|
while (fgets(line, MAX_LINE_LEN, fp)) {
|
||||||
std::string info(line);
|
std::string info(line);
|
||||||
std::vector<std::string> parts = DString::splitStr(info, ':');
|
std::vector<std::string> parts = DString::splitStr(info, ':');
|
||||||
if (parts.size() == 2)
|
if (parts.size() == 2)
|
||||||
status[parts[0]] = parts[1];
|
m_status[parts[0]] = parts[1];
|
||||||
}
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
return status;
|
return m_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<int> Process::getUids()
|
std::vector<int> Process::getUids()
|
||||||
{
|
{
|
||||||
if (uids.size() == 0) {
|
if (m_uids.size() == 0) {
|
||||||
if (status.find("Uid") != status.end()) {
|
if (m_status.find("Uid") != m_status.end()) {
|
||||||
std::string uidGroup = status["Uid"];
|
std::string uidGroup = m_status["Uid"];
|
||||||
std::vector<std::string> parts = DString::splitStr(uidGroup, '\t');
|
std::vector<std::string> parts = DString::splitStr(uidGroup, '\t');
|
||||||
uids.reserve(parts.size());
|
m_uids.reserve(parts.size());
|
||||||
std::transform(parts.begin(), parts.end(), uids.begin(),
|
std::transform(parts.begin(), parts.end(), m_uids.begin(),
|
||||||
[](std::string idStr) -> int {return std::stoi(idStr);});
|
[](std::string idStr) -> int {return std::stoi(idStr);});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return uids;
|
return m_uids;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Process::getPid()
|
int Process::getPid()
|
||||||
{
|
{
|
||||||
return pid;
|
return m_pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Process::getPpid()
|
int Process::getPpid()
|
||||||
{
|
{
|
||||||
if (ppid == 0) {
|
if (m_ppid == 0) {
|
||||||
if (status.find("PPid") != status.end()) {
|
if (m_status.find("PPid") != m_status.end()) {
|
||||||
ppid = std::stoi(status["PPid"]);
|
m_ppid = std::stoi(m_status["PPid"]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ppid;
|
return m_ppid;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Process::getFile(const std::string &name)
|
std::string Process::getFile(const std::string &name)
|
||||||
{
|
{
|
||||||
return "/proc/" + std::to_string(pid) + "/" + name;
|
return "/proc/" + std::to_string(m_pid) + "/" + name;
|
||||||
}
|
}
|
||||||
|
|
||||||
// /proc is not real file system
|
// /proc is not real file system
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -49,14 +49,14 @@ private:
|
|||||||
std::string getFile(const std::string &name);
|
std::string getFile(const std::string &name);
|
||||||
std::vector<std::string> readFile(std::string fileName);
|
std::vector<std::string> readFile(std::string fileName);
|
||||||
|
|
||||||
int pid;
|
int m_pid;
|
||||||
std::vector<std::string> cmdLine;
|
std::vector<std::string> m_cmdLine;
|
||||||
std::string cwd;
|
std::string m_cwd;
|
||||||
std::string exe;
|
std::string m_exe;
|
||||||
std::vector<std::string> environ;
|
std::vector<std::string> m_environ;
|
||||||
Status status;
|
Status m_status;
|
||||||
std::vector<int> uids;
|
std::vector<int> m_uids;
|
||||||
int ppid;
|
int m_ppid;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PROCESS_H
|
#endif // PROCESS_H
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -26,46 +26,46 @@
|
|||||||
|
|
||||||
XCBUtils::XCBUtils()
|
XCBUtils::XCBUtils()
|
||||||
{
|
{
|
||||||
connect = xcb_connect(nullptr, &screenNum); // nullptr表示默认使用环境变量$DISPLAY获取屏幕
|
m_connect = xcb_connect(nullptr, &m_screenNum); // nullptr表示默认使用环境变量$DISPLAY获取屏幕
|
||||||
if (xcb_connection_has_error(connect)) {
|
if (xcb_connection_has_error(m_connect)) {
|
||||||
std::cout << "XCBUtils: init xcb_connect error" << std::endl;
|
std::cout << "XCBUtils: init xcb_connect error" << std::endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!xcb_ewmh_init_atoms_replies(&ewmh,
|
if (!xcb_ewmh_init_atoms_replies(&m_ewmh,
|
||||||
xcb_ewmh_init_atoms(connect, &ewmh), // 初始化Atom
|
xcb_ewmh_init_atoms(m_connect, &m_ewmh), // 初始化Atom
|
||||||
nullptr))
|
nullptr))
|
||||||
std::cout << "XCBUtils: init ewmh error" << std::endl;
|
std::cout << "XCBUtils: init ewmh error" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
XCBUtils::~XCBUtils()
|
XCBUtils::~XCBUtils()
|
||||||
{
|
{
|
||||||
if (connect) {
|
if (m_connect) {
|
||||||
xcb_disconnect(connect); // 关闭连接并释放
|
xcb_disconnect(m_connect); // 关闭连接并释放
|
||||||
connect = nullptr;
|
m_connect = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
XWindow XCBUtils::allocId()
|
XWindow XCBUtils::allocId()
|
||||||
{
|
{
|
||||||
return xcb_generate_id(connect);
|
return xcb_generate_id(m_connect);
|
||||||
}
|
}
|
||||||
|
|
||||||
void XCBUtils::killClientChecked(XWindow xid)
|
void XCBUtils::killClientChecked(XWindow xid)
|
||||||
{
|
{
|
||||||
xcb_kill_client_checked(connect, xid);
|
xcb_kill_client_checked(m_connect, xid);
|
||||||
}
|
}
|
||||||
|
|
||||||
xcb_get_property_reply_t *XCBUtils::getPropertyValueReply(XWindow xid, XCBAtom property, XCBAtom type)
|
xcb_get_property_reply_t *XCBUtils::getPropertyValueReply(XWindow xid, XCBAtom property, XCBAtom type)
|
||||||
{
|
{
|
||||||
xcb_get_property_cookie_t cookie = xcb_get_property(connect,
|
xcb_get_property_cookie_t cookie = xcb_get_property(m_connect,
|
||||||
0,
|
0,
|
||||||
xid,
|
xid,
|
||||||
property,
|
property,
|
||||||
type,
|
type,
|
||||||
0,
|
0,
|
||||||
MAXLEN);
|
MAXLEN);
|
||||||
return xcb_get_property_reply(connect, cookie, nullptr);
|
return xcb_get_property_reply(m_connect, cookie, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *XCBUtils::getPropertyValue(XWindow xid, XCBAtom property, XCBAtom type)
|
void *XCBUtils::getPropertyValue(XWindow xid, XCBAtom property, XCBAtom type)
|
||||||
@ -84,7 +84,7 @@ void *XCBUtils::getPropertyValue(XWindow xid, XCBAtom property, XCBAtom type)
|
|||||||
std::string XCBUtils::getUTF8PropertyStr(XWindow xid, XCBAtom property)
|
std::string XCBUtils::getUTF8PropertyStr(XWindow xid, XCBAtom property)
|
||||||
{
|
{
|
||||||
std::string ret;
|
std::string ret;
|
||||||
xcb_get_property_reply_t *reply = getPropertyValueReply(xid, property, ewmh.UTF8_STRING);
|
xcb_get_property_reply_t *reply = getPropertyValueReply(xid, property, m_ewmh.UTF8_STRING);
|
||||||
if (reply) {
|
if (reply) {
|
||||||
ret = getUTF8StrFromReply(reply);
|
ret = getUTF8StrFromReply(reply);
|
||||||
|
|
||||||
@ -95,14 +95,14 @@ std::string XCBUtils::getUTF8PropertyStr(XWindow xid, XCBAtom property)
|
|||||||
|
|
||||||
XCBAtom XCBUtils::getAtom(const char *name)
|
XCBAtom XCBUtils::getAtom(const char *name)
|
||||||
{
|
{
|
||||||
XCBAtom ret = atomCache.getVal(name);
|
XCBAtom ret = m_atomCache.getVal(name);
|
||||||
if (ret == ATOMNONE) {
|
if (ret == ATOMNONE) {
|
||||||
xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connect, false, strlen(name), name);
|
xcb_intern_atom_cookie_t cookie = xcb_intern_atom(m_connect, false, strlen(name), name);
|
||||||
xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply (connect,
|
xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply (m_connect,
|
||||||
cookie,
|
cookie,
|
||||||
nullptr);
|
nullptr);
|
||||||
if (reply) {
|
if (reply) {
|
||||||
atomCache.store(name, reply->atom);
|
m_atomCache.store(name, reply->atom);
|
||||||
ret = reply->atom;
|
ret = reply->atom;
|
||||||
|
|
||||||
free(reply);
|
free(reply);
|
||||||
@ -114,16 +114,16 @@ XCBAtom XCBUtils::getAtom(const char *name)
|
|||||||
|
|
||||||
std::string XCBUtils::getAtomName(XCBAtom atom)
|
std::string XCBUtils::getAtomName(XCBAtom atom)
|
||||||
{
|
{
|
||||||
std::string ret = atomCache.getName(atom);
|
std::string ret = m_atomCache.getName(atom);
|
||||||
if (ret.empty()) {
|
if (ret.empty()) {
|
||||||
xcb_get_atom_name_cookie_t cookie = xcb_get_atom_name(connect, atom);
|
xcb_get_atom_name_cookie_t cookie = xcb_get_atom_name(m_connect, atom);
|
||||||
xcb_get_atom_name_reply_t *reply = xcb_get_atom_name_reply(connect,
|
xcb_get_atom_name_reply_t *reply = xcb_get_atom_name_reply(m_connect,
|
||||||
cookie,
|
cookie,
|
||||||
nullptr);
|
nullptr);
|
||||||
if (reply) {
|
if (reply) {
|
||||||
char *name = xcb_get_atom_name_name(reply);
|
char *name = xcb_get_atom_name_name(reply);
|
||||||
if (name) {
|
if (name) {
|
||||||
atomCache.store(name, atom);
|
m_atomCache.store(name, atom);
|
||||||
ret = name;
|
ret = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,8 +137,8 @@ std::string XCBUtils::getAtomName(XCBAtom atom)
|
|||||||
Geometry XCBUtils::getWindowGeometry(XWindow xid)
|
Geometry XCBUtils::getWindowGeometry(XWindow xid)
|
||||||
{
|
{
|
||||||
Geometry ret;
|
Geometry ret;
|
||||||
xcb_get_geometry_cookie_t cookie = xcb_get_geometry(connect, xid);
|
xcb_get_geometry_cookie_t cookie = xcb_get_geometry(m_connect, xid);
|
||||||
xcb_get_geometry_reply_t *reply = xcb_get_geometry_reply(connect, cookie, nullptr);
|
xcb_get_geometry_reply_t *reply = xcb_get_geometry_reply(m_connect, cookie, nullptr);
|
||||||
if (reply) {
|
if (reply) {
|
||||||
ret.x = reply->x;
|
ret.x = reply->x;
|
||||||
ret.y = reply->y;
|
ret.y = reply->y;
|
||||||
@ -156,8 +156,8 @@ Geometry XCBUtils::getWindowGeometry(XWindow xid)
|
|||||||
XWindow XCBUtils::getActiveWindow()
|
XWindow XCBUtils::getActiveWindow()
|
||||||
{
|
{
|
||||||
XWindow ret;
|
XWindow ret;
|
||||||
xcb_get_property_cookie_t cookie = xcb_ewmh_get_active_window(&ewmh, screenNum);
|
xcb_get_property_cookie_t cookie = xcb_ewmh_get_active_window(&m_ewmh, m_screenNum);
|
||||||
if (!xcb_ewmh_get_active_window_reply(&ewmh, cookie, &ret, nullptr))
|
if (!xcb_ewmh_get_active_window_reply(&m_ewmh, cookie, &ret, nullptr))
|
||||||
std::cout << "getActiveWindow error" << std::endl;
|
std::cout << "getActiveWindow error" << std::endl;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -165,15 +165,15 @@ XWindow XCBUtils::getActiveWindow()
|
|||||||
|
|
||||||
void XCBUtils::setActiveWindow(XWindow xid)
|
void XCBUtils::setActiveWindow(XWindow xid)
|
||||||
{
|
{
|
||||||
xcb_ewmh_set_active_window(&ewmh, screenNum, xid);
|
xcb_ewmh_set_active_window(&m_ewmh, m_screenNum, xid);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::list<XWindow> XCBUtils::getClientList()
|
std::list<XWindow> XCBUtils::getClientList()
|
||||||
{
|
{
|
||||||
std::list<XWindow> ret;
|
std::list<XWindow> ret;
|
||||||
xcb_get_property_cookie_t cookie = xcb_ewmh_get_client_list(&ewmh, screenNum);
|
xcb_get_property_cookie_t cookie = xcb_ewmh_get_client_list(&m_ewmh, m_screenNum);
|
||||||
xcb_ewmh_get_windows_reply_t reply;
|
xcb_ewmh_get_windows_reply_t reply;
|
||||||
if (!xcb_ewmh_get_client_list_reply(&ewmh, cookie, &reply, nullptr))
|
if (!xcb_ewmh_get_client_list_reply(&m_ewmh, cookie, &reply, nullptr))
|
||||||
std::cout << "getClientList error" << std::endl;
|
std::cout << "getClientList error" << std::endl;
|
||||||
|
|
||||||
for (uint32_t i = 0; i < reply.windows_len; i++)
|
for (uint32_t i = 0; i < reply.windows_len; i++)
|
||||||
@ -185,9 +185,9 @@ std::list<XWindow> XCBUtils::getClientList()
|
|||||||
std::list<XWindow> XCBUtils::getClientListStacking()
|
std::list<XWindow> XCBUtils::getClientListStacking()
|
||||||
{
|
{
|
||||||
std::list<XWindow> ret;
|
std::list<XWindow> ret;
|
||||||
xcb_get_property_cookie_t cookie = xcb_ewmh_get_client_list_stacking(&ewmh, screenNum);
|
xcb_get_property_cookie_t cookie = xcb_ewmh_get_client_list_stacking(&m_ewmh, m_screenNum);
|
||||||
xcb_ewmh_get_windows_reply_t reply;
|
xcb_ewmh_get_windows_reply_t reply;
|
||||||
if (!xcb_ewmh_get_client_list_stacking_reply(&ewmh, cookie, &reply, nullptr))
|
if (!xcb_ewmh_get_client_list_stacking_reply(&m_ewmh, cookie, &reply, nullptr))
|
||||||
std::cout << "getClientListStacking error" << std::endl;
|
std::cout << "getClientListStacking error" << std::endl;
|
||||||
|
|
||||||
for (uint32_t i = 0; i < reply.windows_len; i++)
|
for (uint32_t i = 0; i < reply.windows_len; i++)
|
||||||
@ -199,9 +199,9 @@ std::list<XWindow> XCBUtils::getClientListStacking()
|
|||||||
std::vector<XCBAtom> XCBUtils::getWMState(XWindow xid)
|
std::vector<XCBAtom> XCBUtils::getWMState(XWindow xid)
|
||||||
{
|
{
|
||||||
std::vector<XCBAtom> ret;
|
std::vector<XCBAtom> ret;
|
||||||
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_state(&ewmh, xid);
|
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_state(&m_ewmh, xid);
|
||||||
xcb_ewmh_get_atoms_reply_t reply; // a list of Atom
|
xcb_ewmh_get_atoms_reply_t reply; // a list of Atom
|
||||||
if (xcb_ewmh_get_wm_state_reply(&ewmh, cookie, &reply, nullptr)) {
|
if (xcb_ewmh_get_wm_state_reply(&m_ewmh, cookie, &reply, nullptr)) {
|
||||||
for (uint32_t i = 0; i < reply.atoms_len; i++) {
|
for (uint32_t i = 0; i < reply.atoms_len; i++) {
|
||||||
ret.push_back(reply.atoms[i]);
|
ret.push_back(reply.atoms[i]);
|
||||||
}
|
}
|
||||||
@ -215,9 +215,9 @@ std::vector<XCBAtom> XCBUtils::getWMState(XWindow xid)
|
|||||||
std::vector<XCBAtom> XCBUtils::getWMWindoType(XWindow xid)
|
std::vector<XCBAtom> XCBUtils::getWMWindoType(XWindow xid)
|
||||||
{
|
{
|
||||||
std::vector<XCBAtom> ret;
|
std::vector<XCBAtom> ret;
|
||||||
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_window_type(&ewmh, xid);
|
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_window_type(&m_ewmh, xid);
|
||||||
xcb_ewmh_get_atoms_reply_t reply; // a list of Atom
|
xcb_ewmh_get_atoms_reply_t reply; // a list of Atom
|
||||||
if (!xcb_ewmh_get_wm_window_type_reply(&ewmh, cookie, &reply, nullptr))
|
if (!xcb_ewmh_get_wm_window_type_reply(&m_ewmh, cookie, &reply, nullptr))
|
||||||
std::cout << xid << " getWMWindoType error" << std::endl;
|
std::cout << xid << " getWMWindoType error" << std::endl;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -226,9 +226,9 @@ std::vector<XCBAtom> XCBUtils::getWMWindoType(XWindow xid)
|
|||||||
std::vector<XCBAtom> XCBUtils::getWMAllowedActions(XWindow xid)
|
std::vector<XCBAtom> XCBUtils::getWMAllowedActions(XWindow xid)
|
||||||
{
|
{
|
||||||
std::vector<XCBAtom> ret;
|
std::vector<XCBAtom> ret;
|
||||||
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_allowed_actions(&ewmh, xid);
|
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_allowed_actions(&m_ewmh, xid);
|
||||||
xcb_ewmh_get_atoms_reply_t reply; // a list of Atoms
|
xcb_ewmh_get_atoms_reply_t reply; // a list of Atoms
|
||||||
if (!xcb_ewmh_get_wm_allowed_actions_reply(&ewmh, cookie, &reply, nullptr))
|
if (!xcb_ewmh_get_wm_allowed_actions_reply(&m_ewmh, cookie, &reply, nullptr))
|
||||||
std::cout << xid << " getWMAllowedActions error" << std::endl;
|
std::cout << xid << " getWMAllowedActions error" << std::endl;
|
||||||
|
|
||||||
for (uint32_t i = 0; i < reply.atoms_len; i++) {
|
for (uint32_t i = 0; i < reply.atoms_len; i++) {
|
||||||
@ -244,15 +244,15 @@ void XCBUtils::setWMAllowedActions(XWindow xid, std::vector<XCBAtom> actions)
|
|||||||
for (size_t i = 0; i < actions.size(); i++)
|
for (size_t i = 0; i < actions.size(); i++)
|
||||||
list[i] = actions[i];
|
list[i] = actions[i];
|
||||||
|
|
||||||
xcb_ewmh_set_wm_allowed_actions(&ewmh, xid, actions.size(), list);
|
xcb_ewmh_set_wm_allowed_actions(&m_ewmh, xid, actions.size(), list);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string XCBUtils::getWMName(XWindow xid)
|
std::string XCBUtils::getWMName(XWindow xid)
|
||||||
{
|
{
|
||||||
std::string ret;
|
std::string ret;
|
||||||
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_name(&ewmh, xid);
|
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_name(&m_ewmh, xid);
|
||||||
xcb_ewmh_get_utf8_strings_reply_t reply1;
|
xcb_ewmh_get_utf8_strings_reply_t reply1;
|
||||||
if (!xcb_ewmh_get_wm_name_reply(&ewmh, cookie, &reply1, nullptr))
|
if (!xcb_ewmh_get_wm_name_reply(&m_ewmh, cookie, &reply1, nullptr))
|
||||||
std::cout << xid << " getWMName error" << std::endl;
|
std::cout << xid << " getWMName error" << std::endl;
|
||||||
|
|
||||||
ret.assign(reply1.strings);
|
ret.assign(reply1.strings);
|
||||||
@ -263,8 +263,8 @@ std::string XCBUtils::getWMName(XWindow xid)
|
|||||||
uint32_t XCBUtils::getWMPid(XWindow xid)
|
uint32_t XCBUtils::getWMPid(XWindow xid)
|
||||||
{
|
{
|
||||||
uint32_t ret = 0;
|
uint32_t ret = 0;
|
||||||
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_pid(&ewmh, xid);
|
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_pid(&m_ewmh, xid);
|
||||||
if (!xcb_ewmh_get_wm_pid_reply(&ewmh, cookie, &ret, nullptr))
|
if (!xcb_ewmh_get_wm_pid_reply(&m_ewmh, cookie, &ret, nullptr))
|
||||||
std::cout << xid << " getWMPid error" << std::endl;
|
std::cout << xid << " getWMPid error" << std::endl;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -273,9 +273,9 @@ uint32_t XCBUtils::getWMPid(XWindow xid)
|
|||||||
std::string XCBUtils::getWMIconName(XWindow xid)
|
std::string XCBUtils::getWMIconName(XWindow xid)
|
||||||
{
|
{
|
||||||
std::string ret;
|
std::string ret;
|
||||||
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_icon_name(&ewmh, xid);
|
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_icon_name(&m_ewmh, xid);
|
||||||
xcb_ewmh_get_utf8_strings_reply_t reply;
|
xcb_ewmh_get_utf8_strings_reply_t reply;
|
||||||
if (!xcb_ewmh_get_wm_icon_name_reply(&ewmh, cookie, &reply, nullptr))
|
if (!xcb_ewmh_get_wm_icon_name_reply(&m_ewmh, cookie, &reply, nullptr))
|
||||||
std::cout << xid << " getWMIconName error" << std::endl;
|
std::cout << xid << " getWMIconName error" << std::endl;
|
||||||
|
|
||||||
ret.assign(reply.strings);
|
ret.assign(reply.strings);
|
||||||
@ -326,14 +326,14 @@ XWindow XCBUtils::getWMClientLeader(XWindow xid)
|
|||||||
|
|
||||||
void XCBUtils::requestCloseWindow(XWindow xid, uint32_t timestamp)
|
void XCBUtils::requestCloseWindow(XWindow xid, uint32_t timestamp)
|
||||||
{
|
{
|
||||||
xcb_ewmh_request_close_window(&ewmh, screenNum, xid, timestamp, XCB_EWMH_CLIENT_SOURCE_TYPE_OTHER);
|
xcb_ewmh_request_close_window(&m_ewmh, m_screenNum, xid, timestamp, XCB_EWMH_CLIENT_SOURCE_TYPE_OTHER);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t XCBUtils::getWMDesktop(XWindow xid)
|
uint32_t XCBUtils::getWMDesktop(XWindow xid)
|
||||||
{
|
{
|
||||||
uint32_t ret;
|
uint32_t ret;
|
||||||
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_desktop(&ewmh, xid);
|
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_desktop(&m_ewmh, xid);
|
||||||
if (!xcb_ewmh_get_wm_desktop_reply(&ewmh, cookie, &ret, nullptr))
|
if (!xcb_ewmh_get_wm_desktop_reply(&m_ewmh, cookie, &ret, nullptr))
|
||||||
std::cout << xid << " getWMDesktop error" << std::endl;
|
std::cout << xid << " getWMDesktop error" << std::endl;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -341,19 +341,19 @@ uint32_t XCBUtils::getWMDesktop(XWindow xid)
|
|||||||
|
|
||||||
void XCBUtils::setWMDesktop(XWindow xid, uint32_t desktop)
|
void XCBUtils::setWMDesktop(XWindow xid, uint32_t desktop)
|
||||||
{
|
{
|
||||||
xcb_ewmh_set_wm_desktop(&ewmh, xid, desktop);
|
xcb_ewmh_set_wm_desktop(&m_ewmh, xid, desktop);
|
||||||
}
|
}
|
||||||
|
|
||||||
void XCBUtils::setCurrentWMDesktop(uint32_t desktop)
|
void XCBUtils::setCurrentWMDesktop(uint32_t desktop)
|
||||||
{
|
{
|
||||||
xcb_ewmh_set_current_desktop(&ewmh, screenNum, desktop);
|
xcb_ewmh_set_current_desktop(&m_ewmh, m_screenNum, desktop);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t XCBUtils::getCurrentWMDesktop()
|
uint32_t XCBUtils::getCurrentWMDesktop()
|
||||||
{
|
{
|
||||||
uint32_t ret;
|
uint32_t ret;
|
||||||
xcb_get_property_cookie_t cookie = xcb_ewmh_get_current_desktop(&ewmh, screenNum);
|
xcb_get_property_cookie_t cookie = xcb_ewmh_get_current_desktop(&m_ewmh, m_screenNum);
|
||||||
if (!xcb_ewmh_get_current_desktop_reply(&ewmh, cookie, &ret, nullptr))
|
if (!xcb_ewmh_get_current_desktop_reply(&m_ewmh, cookie, &ret, nullptr))
|
||||||
std::cout << "getCurrentWMDesktop error" << std::endl;
|
std::cout << "getCurrentWMDesktop error" << std::endl;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -362,9 +362,9 @@ uint32_t XCBUtils::getCurrentWMDesktop()
|
|||||||
bool XCBUtils::isGoodWindow(XWindow xid)
|
bool XCBUtils::isGoodWindow(XWindow xid)
|
||||||
{
|
{
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
xcb_get_geometry_cookie_t cookie = xcb_get_geometry(connect, xid);
|
xcb_get_geometry_cookie_t cookie = xcb_get_geometry(m_connect, xid);
|
||||||
xcb_generic_error_t **errStore = nullptr;
|
xcb_generic_error_t **errStore = nullptr;
|
||||||
xcb_get_geometry_reply_t *reply = xcb_get_geometry_reply(connect, cookie, errStore);
|
xcb_get_geometry_reply_t *reply = xcb_get_geometry_reply(m_connect, cookie, errStore);
|
||||||
if (reply) {
|
if (reply) {
|
||||||
if (!errStore) // 正常获取窗口geometry则判定为good
|
if (!errStore) // 正常获取窗口geometry则判定为good
|
||||||
ret = true;
|
ret = true;
|
||||||
@ -392,8 +392,8 @@ bool XCBUtils::hasXEmbedInfo(XWindow xid)
|
|||||||
XWindow XCBUtils::getWMTransientFor(XWindow xid)
|
XWindow XCBUtils::getWMTransientFor(XWindow xid)
|
||||||
{
|
{
|
||||||
XWindow ret;
|
XWindow ret;
|
||||||
xcb_get_property_cookie_t cookie = xcb_icccm_get_wm_transient_for(connect, xid);
|
xcb_get_property_cookie_t cookie = xcb_icccm_get_wm_transient_for(m_connect, xid);
|
||||||
if (!xcb_icccm_get_wm_transient_for_reply(connect, cookie, &ret, nullptr))
|
if (!xcb_icccm_get_wm_transient_for_reply(m_connect, cookie, &ret, nullptr))
|
||||||
std::cout << xid << " getWMTransientFor error" << std::endl;
|
std::cout << xid << " getWMTransientFor error" << std::endl;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -402,8 +402,8 @@ XWindow XCBUtils::getWMTransientFor(XWindow xid)
|
|||||||
uint32_t XCBUtils::getWMUserTime(XWindow xid)
|
uint32_t XCBUtils::getWMUserTime(XWindow xid)
|
||||||
{
|
{
|
||||||
uint32_t ret;
|
uint32_t ret;
|
||||||
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_user_time(&ewmh, xid);
|
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_user_time(&m_ewmh, xid);
|
||||||
if (!xcb_ewmh_get_wm_user_time_reply(&ewmh, cookie, &ret, nullptr))
|
if (!xcb_ewmh_get_wm_user_time_reply(&m_ewmh, cookie, &ret, nullptr))
|
||||||
std::cout << xid << " getWMUserTime error" << std::endl;
|
std::cout << xid << " getWMUserTime error" << std::endl;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -412,8 +412,8 @@ uint32_t XCBUtils::getWMUserTime(XWindow xid)
|
|||||||
int XCBUtils::getWMUserTimeWindow(XWindow xid)
|
int XCBUtils::getWMUserTimeWindow(XWindow xid)
|
||||||
{
|
{
|
||||||
XCBAtom ret;
|
XCBAtom ret;
|
||||||
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_user_time_window(&ewmh, xid);
|
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_user_time_window(&m_ewmh, xid);
|
||||||
if (!xcb_ewmh_get_wm_user_time_window_reply(&ewmh, cookie, &ret, NULL))
|
if (!xcb_ewmh_get_wm_user_time_window_reply(&m_ewmh, cookie, &ret, NULL))
|
||||||
std::cout << xid << " getWMUserTimeWindow error" << std::endl;
|
std::cout << xid << " getWMUserTimeWindow error" << std::endl;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -422,9 +422,9 @@ int XCBUtils::getWMUserTimeWindow(XWindow xid)
|
|||||||
WMClass XCBUtils::getWMClass(XWindow xid)
|
WMClass XCBUtils::getWMClass(XWindow xid)
|
||||||
{
|
{
|
||||||
WMClass ret;
|
WMClass ret;
|
||||||
xcb_get_property_cookie_t cookie = xcb_icccm_get_wm_class(connect, xid);
|
xcb_get_property_cookie_t cookie = xcb_icccm_get_wm_class(m_connect, xid);
|
||||||
xcb_icccm_get_wm_class_reply_t reply;
|
xcb_icccm_get_wm_class_reply_t reply;
|
||||||
if (!xcb_icccm_get_wm_class_reply(connect, cookie, &reply, nullptr)) {
|
if (!xcb_icccm_get_wm_class_reply(m_connect, cookie, &reply, nullptr)) {
|
||||||
if (reply.class_name)
|
if (reply.class_name)
|
||||||
ret.className.assign(reply.class_name);
|
ret.className.assign(reply.class_name);
|
||||||
|
|
||||||
@ -442,18 +442,18 @@ WMClass XCBUtils::getWMClass(XWindow xid)
|
|||||||
// TODO
|
// TODO
|
||||||
void XCBUtils::minimizeWindow(XWindow xid)
|
void XCBUtils::minimizeWindow(XWindow xid)
|
||||||
{
|
{
|
||||||
xcb_get_property_cookie_t cookie = xcb_icccm_get_wm_hints(connect, xid);
|
xcb_get_property_cookie_t cookie = xcb_icccm_get_wm_hints(m_connect, xid);
|
||||||
xcb_icccm_wm_hints_t *hints = new xcb_icccm_wm_hints_t; // 分配堆空间
|
xcb_icccm_wm_hints_t *hints = new xcb_icccm_wm_hints_t; // 分配堆空间
|
||||||
xcb_icccm_get_wm_hints_reply(connect, cookie, hints, nullptr);
|
xcb_icccm_get_wm_hints_reply(m_connect, cookie, hints, nullptr);
|
||||||
xcb_icccm_wm_hints_set_iconic(hints);
|
xcb_icccm_wm_hints_set_iconic(hints);
|
||||||
xcb_icccm_set_wm_hints(connect, xid, hints);
|
xcb_icccm_set_wm_hints(m_connect, xid, hints);
|
||||||
free(hints);
|
free(hints);
|
||||||
}
|
}
|
||||||
|
|
||||||
void XCBUtils::maxmizeWindow(XWindow xid)
|
void XCBUtils::maxmizeWindow(XWindow xid)
|
||||||
{
|
{
|
||||||
xcb_ewmh_request_change_wm_state(&ewmh
|
xcb_ewmh_request_change_wm_state(&m_ewmh
|
||||||
, screenNum
|
, m_screenNum
|
||||||
, xid
|
, xid
|
||||||
, XCB_EWMH_WM_STATE_ADD
|
, XCB_EWMH_WM_STATE_ADD
|
||||||
, getAtom("_NET_WM_STATE_MAXIMIZED_VERT")
|
, getAtom("_NET_WM_STATE_MAXIMIZED_VERT")
|
||||||
@ -465,7 +465,7 @@ void XCBUtils::maxmizeWindow(XWindow xid)
|
|||||||
std::vector<std::string> XCBUtils::getWMCommand(XWindow xid)
|
std::vector<std::string> XCBUtils::getWMCommand(XWindow xid)
|
||||||
{
|
{
|
||||||
std::vector<std::string> ret;
|
std::vector<std::string> ret;
|
||||||
xcb_get_property_reply_t *reply = getPropertyValueReply(xid, XCB_ATOM_WM_COMMAND, ewmh.UTF8_STRING);
|
xcb_get_property_reply_t *reply = getPropertyValueReply(xid, XCB_ATOM_WM_COMMAND, m_ewmh.UTF8_STRING);
|
||||||
if (reply) {
|
if (reply) {
|
||||||
ret = getUTF8StrsFromReply(reply);
|
ret = getUTF8StrsFromReply(reply);
|
||||||
free(reply);
|
free(reply);
|
||||||
@ -519,7 +519,7 @@ XWindow XCBUtils::getRootWindow()
|
|||||||
{
|
{
|
||||||
XWindow rootWindow = 0;
|
XWindow rootWindow = 0;
|
||||||
/* Get the first screen */
|
/* Get the first screen */
|
||||||
xcb_screen_t *screen = xcb_setup_roots_iterator(xcb_get_setup(connect)).data;
|
xcb_screen_t *screen = xcb_setup_roots_iterator(xcb_get_setup(m_connect)).data;
|
||||||
if (screen)
|
if (screen)
|
||||||
rootWindow = screen->root;
|
rootWindow = screen->root;
|
||||||
|
|
||||||
@ -530,13 +530,13 @@ XWindow XCBUtils::getRootWindow()
|
|||||||
void XCBUtils::registerEvents(XWindow xid, uint32_t eventMask)
|
void XCBUtils::registerEvents(XWindow xid, uint32_t eventMask)
|
||||||
{
|
{
|
||||||
uint32_t value[1] = {eventMask};
|
uint32_t value[1] = {eventMask};
|
||||||
xcb_void_cookie_t cookie = xcb_change_window_attributes_checked(connect,
|
xcb_void_cookie_t cookie = xcb_change_window_attributes_checked(m_connect,
|
||||||
xid,
|
xid,
|
||||||
XCB_CW_EVENT_MASK,
|
XCB_CW_EVENT_MASK,
|
||||||
&value);
|
&value);
|
||||||
xcb_flush(connect);
|
xcb_flush(m_connect);
|
||||||
|
|
||||||
xcb_generic_error_t *error = xcb_request_check(connect, cookie);
|
xcb_generic_error_t *error = xcb_request_check(m_connect, cookie);
|
||||||
if (error != nullptr) {
|
if (error != nullptr) {
|
||||||
std::cout << "window " << xid << "registerEvents error" << std::endl;
|
std::cout << "window " << xid << "registerEvents error" << std::endl;
|
||||||
}
|
}
|
||||||
@ -550,8 +550,8 @@ AtomCache::AtomCache()
|
|||||||
XCBAtom AtomCache::getVal(std::string name)
|
XCBAtom AtomCache::getVal(std::string name)
|
||||||
{
|
{
|
||||||
XCBAtom atom = ATOMNONE;
|
XCBAtom atom = ATOMNONE;
|
||||||
auto search = atoms.find(name);
|
auto search = m_atoms.find(name);
|
||||||
if (search != atoms.end())
|
if (search != m_atoms.end())
|
||||||
atom = search->second;
|
atom = search->second;
|
||||||
|
|
||||||
return atom;
|
return atom;
|
||||||
@ -560,8 +560,8 @@ XCBAtom AtomCache::getVal(std::string name)
|
|||||||
std::string AtomCache::getName(XCBAtom atom)
|
std::string AtomCache::getName(XCBAtom atom)
|
||||||
{
|
{
|
||||||
std::string ret;
|
std::string ret;
|
||||||
auto search = atomNames.find(atom);
|
auto search = m_atomNames.find(atom);
|
||||||
if (search != atomNames.end())
|
if (search != m_atomNames.end())
|
||||||
ret = search->second;
|
ret = search->second;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -569,6 +569,6 @@ std::string AtomCache::getName(XCBAtom atom)
|
|||||||
|
|
||||||
void AtomCache::store(std::string name, XCBAtom value)
|
void AtomCache::store(std::string name, XCBAtom value)
|
||||||
{
|
{
|
||||||
atoms[name] = value;
|
m_atoms[name] = value;
|
||||||
atomNames[value] = name;
|
m_atomNames[value] = name;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -42,6 +42,7 @@ typedef xcb_map_notify_event_t MapEvent;
|
|||||||
typedef xcb_configure_notify_event_t ConfigureEvent;
|
typedef xcb_configure_notify_event_t ConfigureEvent;
|
||||||
typedef xcb_property_notify_event_t PropertyEvent;
|
typedef xcb_property_notify_event_t PropertyEvent;
|
||||||
typedef xcb_event_mask_t EventMask;
|
typedef xcb_event_mask_t EventMask;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
std::string instanceName;
|
std::string instanceName;
|
||||||
std::string className;
|
std::string className;
|
||||||
@ -77,8 +78,8 @@ public:
|
|||||||
void store(std::string name, XCBAtom value);
|
void store(std::string name, XCBAtom value);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
std::map<std::string, XCBAtom> atoms;
|
std::map<std::string, XCBAtom> m_atoms;
|
||||||
std::map<XCBAtom, std::string> atomNames;
|
std::map<XCBAtom, std::string> m_atomNames;
|
||||||
};
|
};
|
||||||
|
|
||||||
// XCB接口封装, 参考getCurrentWMDesktop
|
// XCB接口封装, 参考getCurrentWMDesktop
|
||||||
@ -95,9 +96,6 @@ public:
|
|||||||
return &instance;
|
return &instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
// test
|
|
||||||
xcb_connection_t *getConnect() {return connect;}
|
|
||||||
|
|
||||||
/************************* xcb method ***************************/
|
/************************* xcb method ***************************/
|
||||||
// 分配XID
|
// 分配XID
|
||||||
XWindow allocId();
|
XWindow allocId();
|
||||||
@ -262,11 +260,11 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
xcb_connection_t *connect;
|
xcb_connection_t *m_connect;
|
||||||
int screenNum;
|
int m_screenNum;
|
||||||
|
|
||||||
xcb_ewmh_connection_t ewmh;
|
xcb_ewmh_connection_t m_ewmh;
|
||||||
AtomCache atomCache; // 和ewmh中Atom类型存在重复部分,扩张了自定义类型
|
AtomCache m_atomCache; // 和ewmh中Atom类型存在重复部分,扩张了自定义类型
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // XCBUTILS_H
|
#endif // XCBUTILS_H
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -46,7 +46,7 @@ void AppInfo::init(DesktopInfo &info)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string xDeepinVendor= info.kf.getStr(MainSection, "X-Deepin-Vendor");
|
std::string xDeepinVendor= info.getKeyFile()->getStr(MainSection, "X-Deepin-Vendor");
|
||||||
if (xDeepinVendor == "deepin") {
|
if (xDeepinVendor == "deepin") {
|
||||||
name = info.getGenericName().c_str();
|
name = info.getGenericName().c_str();
|
||||||
if (name.isEmpty())
|
if (name.isEmpty())
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -81,7 +81,7 @@ Dock::Dock(QObject *parent)
|
|||||||
});
|
});
|
||||||
thread.detach();
|
thread.detach();
|
||||||
x11Manager->listenRootWindowXEvent();
|
x11Manager->listenRootWindowXEvent();
|
||||||
connect(x11Manager, SIGNAL(X11Manager::needUpdateHideState), this, SLOT(updateHideState));
|
connect(x11Manager, SIGNAL(X11Manager::requestUpdateHideState), this, SLOT(updateHideState));
|
||||||
}
|
}
|
||||||
Q_EMIT serviceRestarted();
|
Q_EMIT serviceRestarted();
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -262,7 +262,7 @@ void X11Manager::handleRootWindowPropertyNotifyEvent(XCBAtom atom)
|
|||||||
else if (atom == XCB->getAtom("_NET_ACTIVE_WINDOW"))
|
else if (atom == XCB->getAtom("_NET_ACTIVE_WINDOW"))
|
||||||
handleActiveWindowChangedX();
|
handleActiveWindowChangedX();
|
||||||
else if (atom == XCB->getAtom("_NET_SHOWING_DESKTOP"))
|
else if (atom == XCB->getAtom("_NET_SHOWING_DESKTOP"))
|
||||||
Q_EMIT needUpdateHideState(false);
|
Q_EMIT requestUpdateHideState(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// destory event
|
// destory event
|
||||||
@ -302,7 +302,7 @@ void X11Manager::handleConfigureNotifyEvent(XWindow xid, int x, int y, int width
|
|||||||
if (wmClass.className.c_str() == frontendWindowWmClass)
|
if (wmClass.className.c_str() == frontendWindowWmClass)
|
||||||
return; // ignore frontend window ConfigureNotify event
|
return; // ignore frontend window ConfigureNotify event
|
||||||
|
|
||||||
Q_EMIT needUpdateHideState(winInfo->isGeometryChanged(x, y, width, height));
|
Q_EMIT requestUpdateHideState(winInfo->isGeometryChanged(x, y, width, height));
|
||||||
}
|
}
|
||||||
|
|
||||||
// property changed event
|
// property changed event
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -58,8 +58,8 @@ public:
|
|||||||
void listenXEventUseXlib();
|
void listenXEventUseXlib();
|
||||||
void listenXEventUseXCB();
|
void listenXEventUseXCB();
|
||||||
|
|
||||||
signals:
|
Q_SIGNALS:
|
||||||
void needUpdateHideState(bool delay);
|
void requestUpdateHideState(bool delay);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void addWindowLastConfigureEvent(XWindow xid, ConfigureEvent* event);
|
void addWindowLastConfigureEvent(XWindow xid, ConfigureEvent* event);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -254,9 +254,9 @@ bool Launcher::requestSendToDesktop(QString appId)
|
|||||||
|
|
||||||
// 创建桌面快捷方式文件
|
// 创建桌面快捷方式文件
|
||||||
DesktopInfo dinfo(itemsMap[appId].info.path.toStdString());
|
DesktopInfo dinfo(itemsMap[appId].info.path.toStdString());
|
||||||
dinfo.kf.setKey(MainSection, dbusService.toStdString(), "X-Deepin-CreatedBy");
|
dinfo.getKeyFile()->setKey(MainSection, dbusService.toStdString(), "X-Deepin-CreatedBy");
|
||||||
dinfo.kf.setKey(MainSection, appId.toStdString(), "X-Deepin-AppID");
|
dinfo.getKeyFile()->setKey(MainSection, appId.toStdString(), "X-Deepin-AppID");
|
||||||
if (!dinfo.kf.saveToFile(filePath.toStdString()))
|
if (!dinfo.getKeyFile()->saveToFile(filePath.toStdString()))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
std::thread thread([]() {
|
std::thread thread([]() {
|
||||||
@ -824,7 +824,7 @@ AppType Launcher::getAppType(DesktopInfo &info, const Item &item)
|
|||||||
QFileInfo fileInfo;
|
QFileInfo fileInfo;
|
||||||
// 判断是否为flatpak应用
|
// 判断是否为flatpak应用
|
||||||
do {
|
do {
|
||||||
if (!info.kf.containKey(MainSection, "X-Flatpak"))
|
if (!info.getKeyFile()->containKey(MainSection, "X-Flatpak"))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
std::vector<std::string> parts = DString::splitStr(info.getCommandLine(), ' ');
|
std::vector<std::string> parts = DString::splitStr(info.getCommandLine(), ' ');
|
||||||
@ -863,7 +863,7 @@ AppType Launcher::getAppType(DesktopInfo &info, const Item &item)
|
|||||||
|
|
||||||
// 判断是否为wineApp
|
// 判断是否为wineApp
|
||||||
do {
|
do {
|
||||||
std::string createdBy = info.kf.getStr(MainSection, "X-Created-By");
|
std::string createdBy = info.getKeyFile()->getStr(MainSection, "X-Created-By");
|
||||||
if (DString::startWith(createdBy, "cxoffice-") || strstr(info.getCommandLine().c_str(), "env WINEPREFIX=")) {
|
if (DString::startWith(createdBy, "cxoffice-") || strstr(info.getCommandLine().c_str(), "env WINEPREFIX=")) {
|
||||||
ty = AppType::WineApp;
|
ty = AppType::WineApp;
|
||||||
goto end;
|
goto end;
|
||||||
@ -1052,10 +1052,10 @@ bool Launcher::isDeepinCustomDesktopFile(QString fileName)
|
|||||||
|
|
||||||
Item Launcher:: NewItemWithDesktopInfo(DesktopInfo &info)
|
Item Launcher:: NewItemWithDesktopInfo(DesktopInfo &info)
|
||||||
{
|
{
|
||||||
QString enName(info.kf.getStr(MainSection, KeyName).c_str());
|
QString enName(info.getKeyFile()->getStr(MainSection, KeyName).c_str());
|
||||||
QString enComment(info.kf.getStr(MainSection, KeyComment).c_str());
|
QString enComment(info.getKeyFile()->getStr(MainSection, KeyComment).c_str());
|
||||||
QString xDeepinCategory(info.kf.getStr(MainSection, "X-Deepin-Category").c_str());
|
QString xDeepinCategory(info.getKeyFile()->getStr(MainSection, "X-Deepin-Category").c_str());
|
||||||
QString xDeepinVendor(info.kf.getStr(MainSection, "X-Deepin-Vendor").c_str());
|
QString xDeepinVendor(info.getKeyFile()->getStr(MainSection, "X-Deepin-Vendor").c_str());
|
||||||
|
|
||||||
QString appName;
|
QString appName;
|
||||||
if (xDeepinVendor == "deepin")
|
if (xDeepinVendor == "deepin")
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
@ -113,7 +113,8 @@ QVector<QString> LauncherSettings::getHiddenApps()
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
LauncherSettings::LauncherSettings(QObject *parent) : QObject(parent)
|
LauncherSettings::LauncherSettings(QObject *parent)
|
||||||
|
: QObject(parent)
|
||||||
{
|
{
|
||||||
// 绑定属性
|
// 绑定属性
|
||||||
connect(dconfig, &DConfig::valueChanged, this, [&] (const QString &key) {
|
connect(dconfig, &DConfig::valueChanged, this, [&] (const QString &key) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
64
src/modules/startmanager/common.h
Normal file
64
src/modules/startmanager/common.h
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
|
*
|
||||||
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* Maintainer: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef COMMON_H
|
||||||
|
#define COMMON_H
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
const QString AMServiceName = "/org/desktopspec/ApplicationManager";
|
||||||
|
const QString autostartDir = "autostart";
|
||||||
|
const QString proxychainsBinary = "proxychains4";
|
||||||
|
|
||||||
|
const QString configLauncher = "com.deepin.dde.launcher";
|
||||||
|
const QString keyAppsUseProxy = "Apps_Use_Proxy";
|
||||||
|
const QString keyAppsDisableScaling = "Apps_Disable_Scaling";
|
||||||
|
|
||||||
|
const QString KeyXGnomeAutostartDelay = "X-GNOME-Autostart-Delay";
|
||||||
|
const QString KeyXGnomeAutoRestart = "X-GNOME-AutoRestart";
|
||||||
|
const QString KeyXDeepinCreatedBy = "X-Deepin-CreatedBy";
|
||||||
|
const QString KeyXDeepinAppID = "X-Deepin-AppID";
|
||||||
|
|
||||||
|
const QString configStartdde = "com.deepin.dde.startdde";
|
||||||
|
const QString keyAutostartDelay = "Autostart_Delay";
|
||||||
|
const QString keyMemCheckerEnabled = "Memchecker_Enabled";
|
||||||
|
const QString keySwapSchedEnabled = "swap-sched-enabled";
|
||||||
|
|
||||||
|
const QString configXsettings = "com.deepin.xsettings";
|
||||||
|
const QString keyScaleFactor = "Scale_Factor";
|
||||||
|
|
||||||
|
const QString uiAppSchedHooksDir = "/usr/lib/UIAppSched.hooks";
|
||||||
|
const QString launchedHookDir = uiAppSchedHooksDir + "/launched";
|
||||||
|
|
||||||
|
const QString cpuFreqAdjustFile = "/usr/share/startdde/app_startup.conf";
|
||||||
|
const QString performanceGovernor = "performance";
|
||||||
|
|
||||||
|
const int restartRateLimitSeconds = 60;
|
||||||
|
|
||||||
|
const QString sysMemLimitConfig = "/usr/share/startdde/memchecker.json";
|
||||||
|
|
||||||
|
const int defaultMinMemAvail = 300; // 300M
|
||||||
|
const int defaultMaxSwapUsed = 1200; // 1200M
|
||||||
|
|
||||||
|
const QString autostartAdded = "added";
|
||||||
|
const QString autostartDeleted = "deleted";
|
||||||
|
|
||||||
|
#endif // COMMON_H
|
470
src/modules/startmanager/startmanager.cpp
Normal file
470
src/modules/startmanager/startmanager.cpp
Normal file
@ -0,0 +1,470 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
|
*
|
||||||
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* Maintainer: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "startmanager.h"
|
||||||
|
#include "basedir.h"
|
||||||
|
#include "dfile.h"
|
||||||
|
#include "common.h"
|
||||||
|
#include "desktopinfo.h"
|
||||||
|
#include "startmanagersettings.h"
|
||||||
|
#include "startmanagerdbushandler.h"
|
||||||
|
#include "meminfo.h"
|
||||||
|
|
||||||
|
#include <QFileSystemWatcher>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QProcess>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QThread>
|
||||||
|
|
||||||
|
#define DESKTOPEXT ".desktop"
|
||||||
|
#define SETTING StartManagerSettings::instance()
|
||||||
|
|
||||||
|
StartManager::StartManager(QObject *parent)
|
||||||
|
: QObject(parent)
|
||||||
|
, minMemAvail(0)
|
||||||
|
, maxSwapUsed(0)
|
||||||
|
, dbusHandler(new StartManagerDBusHandler(this))
|
||||||
|
, fileWatcher(new QFileSystemWatcher(this))
|
||||||
|
{
|
||||||
|
// load sysMemLimitConfig
|
||||||
|
loadSysMemLimitConfig();
|
||||||
|
|
||||||
|
autostartFiles = getAutostartList();
|
||||||
|
|
||||||
|
// listen autostart files
|
||||||
|
listenAutostartFileEvents();
|
||||||
|
|
||||||
|
// start autostart
|
||||||
|
// TODO only running once when starting system
|
||||||
|
//startAutostartProgram();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief StartManager::addAutostart
|
||||||
|
* @param fileName desktopFile
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
bool StartManager::addAutostart(QString fileName)
|
||||||
|
{
|
||||||
|
return setAutostart(fileName, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief StartManager::removeAutostart
|
||||||
|
* @param fileName desktopFile
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
bool StartManager::removeAutostart(QString fileName)
|
||||||
|
{
|
||||||
|
return setAutostart(fileName, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList StartManager::autostartList()
|
||||||
|
{
|
||||||
|
if (autostartFiles.size() == 0) {
|
||||||
|
autostartFiles = getAutostartList();
|
||||||
|
}
|
||||||
|
|
||||||
|
return autostartFiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString StartManager::dumpMemRecord()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
QString StartManager::getApps()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief StartManager::isAutostart
|
||||||
|
* @param fileName desktopFile
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
bool StartManager::isAutostart(QString fileName)
|
||||||
|
{
|
||||||
|
if (!fileName.endsWith(DESKTOPEXT))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (auto autostartDir : BaseDir::autoStartDirs()) {
|
||||||
|
std::string filePath = autostartDir + fileName.toStdString();
|
||||||
|
if (DFile::isExisted(filePath)) {
|
||||||
|
DesktopInfo info(filePath);
|
||||||
|
if (info.isValidDesktop() && !info.getIsHidden()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StartManager::isMemSufficient()
|
||||||
|
{
|
||||||
|
return SETTING->getMemCheckerEnabled() ? MemInfo::isSufficient(minMemAvail, maxSwapUsed) : true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartManager::launchApp(QString desktopFile, uint32_t timestamp, QStringList files)
|
||||||
|
{
|
||||||
|
doLaunchAppWithOptions(desktopFile, timestamp, files, QMap<QString, QString>());
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartManager::launchAppAction(QString desktopFile, QString actionSection, uint32_t timestamp)
|
||||||
|
{
|
||||||
|
DesktopInfo info(desktopFile.toStdString());
|
||||||
|
if (!info.isValidDesktop())
|
||||||
|
return;
|
||||||
|
|
||||||
|
DesktopAction targetAction;
|
||||||
|
for (auto action : info.getActions()) {
|
||||||
|
if (!action.section.empty() && action.section.c_str() == actionSection) {
|
||||||
|
targetAction = action;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetAction.section.empty()) {
|
||||||
|
qWarning() << "launchAppAction: targetAction section is empty";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetAction.exec.empty()) {
|
||||||
|
qInfo() << "launchAppAction: targetAction exe is empty";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
launch(&info, targetAction.exec.c_str(), timestamp, QStringList());
|
||||||
|
|
||||||
|
// mark app launched
|
||||||
|
dbusHandler->markLaunched(desktopFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartManager::launchAppWithOptions(QString desktopFile, uint32_t timestamp, QStringList files, QMap<QString, QString> options)
|
||||||
|
{
|
||||||
|
doLaunchAppWithOptions(desktopFile, timestamp, files, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartManager::runCommand(QString exe, QStringList args)
|
||||||
|
{
|
||||||
|
doRunCommandWithOptions(exe, args, QMap<QString, QString>());
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartManager::runCommandWithOptions(QString exe, QStringList args, QMap<QString, QString> options)
|
||||||
|
{
|
||||||
|
doRunCommandWithOptions(exe, args, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartManager::tryAgain(bool launch)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartManager::onAutoStartupPathChange(const QString &dirPath)
|
||||||
|
{
|
||||||
|
QStringList autostartFilesList = getAutostartList();
|
||||||
|
QSet<QString> newAutostartFiles = QSet<QString>::fromList(autostartFilesList);
|
||||||
|
QSet<QString> oldAutostartFiles = QSet<QString>::fromList(autostartFiles);
|
||||||
|
|
||||||
|
// 添加
|
||||||
|
QSet<QString> newFiles = newAutostartFiles - oldAutostartFiles;
|
||||||
|
QStringList newFile = newFiles.toList();
|
||||||
|
|
||||||
|
// 移除
|
||||||
|
QSet<QString> deletedFiles = oldAutostartFiles - newAutostartFiles;
|
||||||
|
QStringList deleteFile = deletedFiles.toList();
|
||||||
|
|
||||||
|
// 更新autostartFiles记录
|
||||||
|
autostartFiles = autostartFilesList;
|
||||||
|
|
||||||
|
for (auto &file : newFile) {
|
||||||
|
Q_EMIT autostartChanged(autostartAdded, file);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto &file : deleteFile) {
|
||||||
|
Q_EMIT autostartChanged(autostartDeleted, file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StartManager::setAutostart(QString fileName, bool value)
|
||||||
|
{
|
||||||
|
if (!fileName.endsWith(DESKTOPEXT))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (isAutostart(fileName) == value)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
QFileInfo info(fileName);
|
||||||
|
QString appId = info.baseName();
|
||||||
|
QString autostartDir(BaseDir::userAutoStartDir().c_str());
|
||||||
|
QString autostartFileName = fileName;
|
||||||
|
bool isUserAutostart = false;
|
||||||
|
// if has no user autostart file, create it
|
||||||
|
if (info.isAbsolute()) {
|
||||||
|
if (info.exists() && info.baseName() == autostartDir) {
|
||||||
|
isUserAutostart = true;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
autostartFileName = autostartDir + fileName;
|
||||||
|
if (DFile::isExisted(autostartFileName.toStdString())) {
|
||||||
|
isUserAutostart = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isUserAutostart && !DFile::isExisted(autostartFileName.toStdString())) {
|
||||||
|
// get system autostart desktop file
|
||||||
|
for (auto appDir : BaseDir::appDirs()) {
|
||||||
|
QDir dir(appDir.c_str());
|
||||||
|
dir.setFilter(QDir::Files);
|
||||||
|
dir.setNameFilters({ "*.desktop" });
|
||||||
|
bool hiddenStatusChanged = false;
|
||||||
|
for (auto entry : dir.entryInfoList()) {
|
||||||
|
QString desktopFile = entry.absoluteFilePath();
|
||||||
|
if (!desktopFile.contains(fileName))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!QFile::copy(desktopFile, autostartFileName)) // copy origin file
|
||||||
|
return false;
|
||||||
|
|
||||||
|
hiddenStatusChanged = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hiddenStatusChanged)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// change autostart hidden status in file
|
||||||
|
KeyFile kf;
|
||||||
|
kf.loadFile(autostartFileName.toStdString());
|
||||||
|
kf.setKey(MainSection, KeyXDeepinCreatedBy.toStdString(), AMServiceName.toStdString());
|
||||||
|
kf.setKey(MainSection, KeyXDeepinAppID.toStdString(), appId.toStdString());
|
||||||
|
kf.setBool(MainSection, KeyHidden, !value ? "true" : "false");
|
||||||
|
kf.saveToFile(autostartFileName.toStdString());
|
||||||
|
|
||||||
|
if (value && autostartFiles.indexOf(fileName) != -1) {
|
||||||
|
autostartFiles.push_back(fileName);
|
||||||
|
} else if (!value) {
|
||||||
|
autostartFiles.removeAll(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_EMIT autostartChanged(value ? autostartAdded : autostartDeleted, fileName);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StartManager::doLaunchAppWithOptions(QString desktopFile, uint32_t timestamp, QStringList files, QMap<QString, QString> options)
|
||||||
|
{
|
||||||
|
// launchApp
|
||||||
|
DesktopInfo info(desktopFile.toStdString());
|
||||||
|
if (!info.isValidDesktop())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (options.find("path") != options.end()) {
|
||||||
|
info.getKeyFile()->setKey(MainSection, KeyPath, options["path"].toStdString());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.find("desktop-override-exec") != options.end()) {
|
||||||
|
info.setDesktopOverrideExec(options["desktop-override-exec"].toStdString());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info.getCommandLine().empty()) {
|
||||||
|
qInfo() << "command line is empty";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
launch(&info, info.getCommandLine().c_str(), timestamp, files);
|
||||||
|
|
||||||
|
// mark app launched
|
||||||
|
dbusHandler->markLaunched(desktopFile);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StartManager::launch(DesktopInfo *info, QString cmdLine, uint32_t timestamp, QStringList files)
|
||||||
|
{
|
||||||
|
QProcess process;
|
||||||
|
QStringList cmdPrefixesEnvs;
|
||||||
|
QStringList envs;
|
||||||
|
QString desktopFile(info->getFileName().c_str());
|
||||||
|
QFileInfo fileInfo(desktopFile);
|
||||||
|
QString appId = fileInfo.baseName();
|
||||||
|
|
||||||
|
bool useProxy = shouldUseProxy(appId);
|
||||||
|
for (QString var : QProcess::systemEnvironment()) {
|
||||||
|
if (useProxy && (var.startsWith("auto_proxy")
|
||||||
|
|| var.startsWith("http_proxy")
|
||||||
|
|| var.startsWith("https_proxy")
|
||||||
|
|| var.startsWith("ftp_proxy")
|
||||||
|
|| var.startsWith("all_proxy")
|
||||||
|
|| var.startsWith("SOCKS_SERVER")
|
||||||
|
|| var.startsWith("no_proxy"))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
envs << var;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!appId.isEmpty() && shouldDisableScaling(appId)) {
|
||||||
|
double scale = SETTING->getScaleFactor();
|
||||||
|
scale = scale > 0 ? 1 / scale : 1;
|
||||||
|
QString qtEnv = "QT_SCALE_FACTOR=" + QString::number(scale, 'f', -1);
|
||||||
|
cmdPrefixesEnvs << "/usr/bin/env" << "GDK_DPI_SCALE=1" << "GDK_SCALE=1" << qtEnv;
|
||||||
|
}
|
||||||
|
|
||||||
|
envs << cmdPrefixesEnvs;
|
||||||
|
|
||||||
|
QStringList exeArgs;
|
||||||
|
exeArgs << cmdLine.split(" ") << files;
|
||||||
|
|
||||||
|
if (info->getTerminal()) {
|
||||||
|
exeArgs.insert(0, SETTING->getDefaultTerminalExecArg());
|
||||||
|
exeArgs.insert(0, SETTING->getDefaultTerminalExec());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string workingDir = info->getKeyFile()->getStr(MainSection, KeyPath);
|
||||||
|
if (workingDir.empty()) {
|
||||||
|
workingDir = BaseDir::homeDir();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString exec = exeArgs[0];
|
||||||
|
exeArgs.removeAt(0);
|
||||||
|
|
||||||
|
qDebug() << "launchApp: " << desktopFile << " exec: " << exec << " args: " << exeArgs;
|
||||||
|
process.setWorkingDirectory(workingDir.c_str());
|
||||||
|
process.setEnvironment(envs);
|
||||||
|
return process.startDetached(exec, exeArgs);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StartManager::doRunCommandWithOptions(QString exe, QStringList args, QMap<QString, QString> options)
|
||||||
|
{
|
||||||
|
QProcess process;
|
||||||
|
if (options.find("dir") != options.end()) {
|
||||||
|
process.setWorkingDirectory(options["dir"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return process.startDetached(exe, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartManager::waitCmd(DesktopInfo *info, QProcess *process, QString cmdName)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StartManager::shouldUseProxy(QString appId)
|
||||||
|
{
|
||||||
|
auto useProxyApps = SETTING->getUseProxyApps();
|
||||||
|
if (!useProxyApps.contains(appId))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (dbusHandler->getProxyMsg().isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StartManager::shouldDisableScaling(QString appId)
|
||||||
|
{
|
||||||
|
auto disableScalingApps = SETTING->getDisableScalingApps();
|
||||||
|
return disableScalingApps.contains(appId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartManager::loadSysMemLimitConfig()
|
||||||
|
{
|
||||||
|
std::string configPath = BaseDir::userConfigDir() + "deepin/startdde/memchecker.json";
|
||||||
|
QFile file(configPath.c_str());
|
||||||
|
if (!file.exists())
|
||||||
|
file.setFileName(sysMemLimitConfig);
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (!file.exists())
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
||||||
|
break;
|
||||||
|
|
||||||
|
QJsonDocument doc = QJsonDocument::fromJson(file.readAll());
|
||||||
|
file.close();
|
||||||
|
if (!doc.isObject())
|
||||||
|
break;
|
||||||
|
|
||||||
|
minMemAvail = uint64_t(doc.object()["min-mem-available"].toInt());
|
||||||
|
maxSwapUsed = uint64_t(doc.object()["max-swap-used"].toInt());
|
||||||
|
return;
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
minMemAvail = defaultMinMemAvail;
|
||||||
|
maxSwapUsed = defaultMaxSwapUsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartManager::listenAutostartFileEvents()
|
||||||
|
{
|
||||||
|
for (auto autostartDir : BaseDir::autoStartDirs()) {
|
||||||
|
fileWatcher->addPath(autostartDir.c_str());
|
||||||
|
}
|
||||||
|
connect(fileWatcher, &QFileSystemWatcher::directoryChanged, this, &StartManager::onAutoStartupPathChange, Qt::QueuedConnection);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartManager::startAutostartProgram()
|
||||||
|
{
|
||||||
|
auto func = [&] (QString file, uint64_t delayTime) {
|
||||||
|
QThread::sleep(uint64_t(delayTime));
|
||||||
|
this->launchApp(file, 0, QStringList());
|
||||||
|
};
|
||||||
|
|
||||||
|
for (QString desktopFile : autostartList()) {
|
||||||
|
DesktopInfo info(desktopFile.toStdString());
|
||||||
|
if (!info.isValidDesktop())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
int delayTime = info.getKeyFile()->getInt(MainSection, KeyXGnomeAutostartDelay.toStdString());
|
||||||
|
QTimer::singleShot(0, this, [&, desktopFile, delayTime] {
|
||||||
|
QThread::sleep(uint64_t(delayTime));
|
||||||
|
this->launchApp(desktopFile, 0, QStringList());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList StartManager::getAutostartList()
|
||||||
|
{
|
||||||
|
QStringList ret;
|
||||||
|
for (auto autostartDir : BaseDir::autoStartDirs()) {
|
||||||
|
if (!DFile::isExisted(autostartDir))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
QDir dir(autostartDir.c_str());
|
||||||
|
dir.setFilter(QDir::Files);
|
||||||
|
dir.setNameFilters({ "*.desktop" });
|
||||||
|
for (auto entry : dir.entryInfoList()) {
|
||||||
|
if (ret.contains(entry.absoluteFilePath()))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ret.push_back(entry.absoluteFilePath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
81
src/modules/startmanager/startmanager.h
Normal file
81
src/modules/startmanager/startmanager.h
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
|
*
|
||||||
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* Maintainer: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef STARTMANAGER_H
|
||||||
|
#define STARTMANAGER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QMap>
|
||||||
|
|
||||||
|
class AppLaunchContext;
|
||||||
|
class StartManagerDBusHandler;
|
||||||
|
class DesktopInfo;
|
||||||
|
class QProcess;
|
||||||
|
class QFileSystemWatcher;
|
||||||
|
|
||||||
|
class StartManager : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit StartManager(QObject *parent = nullptr);
|
||||||
|
|
||||||
|
bool addAutostart(QString fileName);
|
||||||
|
bool removeAutostart(QString fileName);
|
||||||
|
QStringList autostartList();
|
||||||
|
QString dumpMemRecord();
|
||||||
|
QString getApps();
|
||||||
|
bool isAutostart(QString fileName);
|
||||||
|
bool isMemSufficient();
|
||||||
|
void launchApp(QString desktopFile, uint32_t timestamp, QStringList files);
|
||||||
|
void launchAppAction(QString desktopFile, QString actionSection, uint32_t timestamp);
|
||||||
|
void launchAppWithOptions(QString desktopFile, uint32_t timestamp, QStringList files, QMap<QString, QString> options);
|
||||||
|
void runCommand(QString exe, QStringList args);
|
||||||
|
void runCommandWithOptions(QString exe, QStringList args, QMap<QString, QString> options);
|
||||||
|
void tryAgain(bool launch);
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void autostartChanged(QString status, QString fileName);
|
||||||
|
|
||||||
|
public Q_SLOTS:
|
||||||
|
void onAutoStartupPathChange(const QString &dirPath);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool setAutostart(QString fileName, bool value);
|
||||||
|
bool doLaunchAppWithOptions(QString desktopFile, uint32_t timestamp, QStringList files, QMap<QString, QString> options);
|
||||||
|
bool launch(DesktopInfo *info, QString cmdLine, uint32_t timestamp, QStringList files);
|
||||||
|
bool doRunCommandWithOptions(QString exe, QStringList args, QMap<QString, QString> options);
|
||||||
|
void waitCmd(DesktopInfo *info, QProcess *process, QString cmdName);
|
||||||
|
bool shouldUseProxy(QString appId);
|
||||||
|
bool shouldDisableScaling(QString appId);
|
||||||
|
void loadSysMemLimitConfig();
|
||||||
|
QStringList getDefaultTerminal();
|
||||||
|
void listenAutostartFileEvents();
|
||||||
|
void startAutostartProgram();
|
||||||
|
QStringList getAutostartList();
|
||||||
|
|
||||||
|
uint64_t minMemAvail;
|
||||||
|
uint64_t maxSwapUsed;
|
||||||
|
StartManagerDBusHandler *dbusHandler;
|
||||||
|
QStringList autostartFiles;
|
||||||
|
QFileSystemWatcher *fileWatcher;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // STARTMANAGER_H
|
56
src/modules/startmanager/startmanagerdbushandler.cpp
Normal file
56
src/modules/startmanager/startmanagerdbushandler.cpp
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
|
*
|
||||||
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* Maintainer: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "startmanagerdbushandler.h"
|
||||||
|
|
||||||
|
#include <QDBusInterface>
|
||||||
|
#include <QDBusReply>
|
||||||
|
|
||||||
|
StartManagerDBusHandler::StartManagerDBusHandler(QObject *parent)
|
||||||
|
: QObject(parent)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartManagerDBusHandler::markLaunched(QString desktopFile)
|
||||||
|
{
|
||||||
|
QDBusInterface interface = QDBusInterface("org.deepin.daemon.AlRecoder1", "/org/deepin/daemon/AlRecoder1", "org.deepin.daemon.AlRecoder1");
|
||||||
|
interface.call("MarkLaunched", desktopFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString StartManagerDBusHandler::getProxyMsg()
|
||||||
|
{
|
||||||
|
QString ret;
|
||||||
|
QDBusInterface interface = QDBusInterface("com.deepin.system.proxy", "/com/deepin/system/proxy", "com.deepin.system.proxy.App");
|
||||||
|
QDBusReply<QString> reply = interface.call("GetProxy");
|
||||||
|
if (reply.isValid())
|
||||||
|
ret = reply.value();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StartManagerDBusHandler::addProxyProc(int32_t pid)
|
||||||
|
{
|
||||||
|
QDBusInterface interface = QDBusInterface("com.deepin.system.proxy", "/com/deepin/system/proxy", "com.deepin.system.proxy.App");
|
||||||
|
interface.call("AddProc");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
43
src/modules/startmanager/startmanagerdbushandler.h
Normal file
43
src/modules/startmanager/startmanagerdbushandler.h
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
|
*
|
||||||
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* Maintainer: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef STARTMANAGERDBUSHANDLER_H
|
||||||
|
#define STARTMANAGERDBUSHANDLER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
class StartManagerDBusHandler : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit StartManagerDBusHandler(QObject *parent = nullptr);
|
||||||
|
|
||||||
|
void markLaunched(QString desktopFile);
|
||||||
|
|
||||||
|
QString getProxyMsg();
|
||||||
|
void addProxyProc(int32_t pid);
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // STARTMANAGERDBUSHANDLER_H
|
108
src/modules/startmanager/startmanagersettings.cpp
Normal file
108
src/modules/startmanager/startmanagersettings.cpp
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
|
*
|
||||||
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* Maintainer: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "startmanagersettings.h"
|
||||||
|
#include "settings.h"
|
||||||
|
#include "gsetting.h"
|
||||||
|
|
||||||
|
#include <DConfig>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
|
||||||
|
DCORE_USE_NAMESPACE
|
||||||
|
|
||||||
|
static DConfig *launchConfig = Settings::ConfigPtr(configLauncher);
|
||||||
|
static DConfig *startConfig = Settings::ConfigPtr(configStartdde);
|
||||||
|
static DConfig *xsettingsConfig = Settings::ConfigPtr(configXsettings);
|
||||||
|
|
||||||
|
QVector<QString> StartManagerSettings::getUseProxyApps()
|
||||||
|
{
|
||||||
|
QVector<QString> ret;
|
||||||
|
if (!launchConfig)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
QList<QVariant> apps = launchConfig->value(keyAppsUseProxy).toList();
|
||||||
|
for (auto app : apps) {
|
||||||
|
ret.push_back(app.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVector<QString> StartManagerSettings::getDisableScalingApps()
|
||||||
|
{
|
||||||
|
QVector<QString> ret;
|
||||||
|
if (!launchConfig)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
QList<QVariant> apps = launchConfig->value(keyAppsDisableScaling).toList();
|
||||||
|
for (auto app : apps) {
|
||||||
|
ret.push_back(app.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool StartManagerSettings::getMemCheckerEnabled()
|
||||||
|
{
|
||||||
|
bool ret = false;
|
||||||
|
if (startConfig) {
|
||||||
|
ret = startConfig->value(keyMemCheckerEnabled).toBool();
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
double StartManagerSettings::getScaleFactor()
|
||||||
|
{
|
||||||
|
double ret = 0;
|
||||||
|
if (xsettingsConfig) {
|
||||||
|
xsettingsConfig->value(keyScaleFactor).toDouble();
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString StartManagerSettings::getDefaultTerminalExec()
|
||||||
|
{
|
||||||
|
QString ret;
|
||||||
|
GSetting settings("com.deepin.desktop.default-applications.terminal");
|
||||||
|
auto exec = settings.getString("exec");
|
||||||
|
if (!exec.empty()) {
|
||||||
|
ret = exec.c_str();
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString StartManagerSettings::getDefaultTerminalExecArg()
|
||||||
|
{
|
||||||
|
QString ret;
|
||||||
|
GSetting settings("com.deepin.desktop.default-applications.terminal");
|
||||||
|
auto execArg = settings.getString("exec-arg");
|
||||||
|
if (!execArg.empty()) {
|
||||||
|
ret = execArg.c_str();
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
StartManagerSettings::StartManagerSettings(QObject *paret)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
62
src/modules/startmanager/startmanagersettings.h
Normal file
62
src/modules/startmanager/startmanagersettings.h
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
|
*
|
||||||
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* Maintainer: weizhixiang <weizhixiang@uniontech.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef STARTMANAGERSETTINGS_H
|
||||||
|
#define STARTMANAGERSETTINGS_H
|
||||||
|
#ifdef signals
|
||||||
|
#undef signals
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "gsetting.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QVector>
|
||||||
|
|
||||||
|
class StartManagerSettings : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
static inline StartManagerSettings *instance() {
|
||||||
|
static StartManagerSettings instance;
|
||||||
|
return &instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
QVector<QString> getUseProxyApps();
|
||||||
|
QVector<QString> getDisableScalingApps();
|
||||||
|
|
||||||
|
bool getMemCheckerEnabled();
|
||||||
|
|
||||||
|
double getScaleFactor();
|
||||||
|
|
||||||
|
QString getDefaultTerminalExec();
|
||||||
|
QString getDefaultTerminalExecArg();
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
|
||||||
|
private:
|
||||||
|
StartManagerSettings(QObject *paret = nullptr);
|
||||||
|
StartManagerSettings(const StartManagerSettings &);
|
||||||
|
StartManagerSettings& operator= (const StartManagerSettings &);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // STARTMANAGERSETTINGS_H
|
@ -7,6 +7,7 @@ find_package(DtkCore REQUIRED)
|
|||||||
|
|
||||||
pkg_check_modules(XCB REQUIRED IMPORTED_TARGET xcb-icccm xcb-ewmh xcb)
|
pkg_check_modules(XCB REQUIRED IMPORTED_TARGET xcb-icccm xcb-ewmh xcb)
|
||||||
pkg_check_modules(X11 REQUIRED IMPORTED_TARGET x11)
|
pkg_check_modules(X11 REQUIRED IMPORTED_TARGET x11)
|
||||||
|
pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0)
|
||||||
|
|
||||||
qt5_add_dbus_adaptor(ADAPTER_SOURCES
|
qt5_add_dbus_adaptor(ADAPTER_SOURCES
|
||||||
../../DBus/org.desktopspec.ApplicationManager.xml
|
../../DBus/org.desktopspec.ApplicationManager.xml
|
||||||
@ -63,6 +64,12 @@ set(SRCS
|
|||||||
../lib/basedir.cpp
|
../lib/basedir.cpp
|
||||||
../lib/xcbutils.h
|
../lib/xcbutils.h
|
||||||
../lib/xcbutils.cpp
|
../lib/xcbutils.cpp
|
||||||
|
../lib/applaunchcontext.h
|
||||||
|
../lib/applaunchcontext.cpp
|
||||||
|
../lib/meminfo.h
|
||||||
|
../lib/meminfo.cpp
|
||||||
|
../lib/gsetting.h
|
||||||
|
../lib/gsetting.cpp
|
||||||
../utils/settings.h
|
../utils/settings.h
|
||||||
../utils/settings.cpp
|
../utils/settings.cpp
|
||||||
../utils/synmodulebase.h
|
../utils/synmodulebase.h
|
||||||
@ -122,6 +129,13 @@ set(SRCS
|
|||||||
../modules/dock/dbusadaptordock.cpp
|
../modules/dock/dbusadaptordock.cpp
|
||||||
../modules/dock/dbusadaptorentry.h
|
../modules/dock/dbusadaptorentry.h
|
||||||
../modules/dock/dbusadaptorentry.cpp
|
../modules/dock/dbusadaptorentry.cpp
|
||||||
|
../modules/startmanager/common.h
|
||||||
|
../modules/startmanager/startmanager.h
|
||||||
|
../modules/startmanager/startmanager.cpp
|
||||||
|
../modules/startmanager/startmanagersettings.h
|
||||||
|
../modules/startmanager/startmanagersettings.cpp
|
||||||
|
../modules/startmanager/startmanagerdbushandler.h
|
||||||
|
../modules/startmanager/startmanagerdbushandler.cpp
|
||||||
../frameworkdbus/types/launcheriteminfo.h
|
../frameworkdbus/types/launcheriteminfo.h
|
||||||
../frameworkdbus/types/launcheriteminfo.cpp
|
../frameworkdbus/types/launcheriteminfo.cpp
|
||||||
../frameworkdbus/types/launcheriteminfolist.h
|
../frameworkdbus/types/launcheriteminfolist.h
|
||||||
@ -168,10 +182,12 @@ target_link_libraries(deepin-application-manager
|
|||||||
pthread
|
pthread
|
||||||
PkgConfig::XCB
|
PkgConfig::XCB
|
||||||
PkgConfig::X11
|
PkgConfig::X11
|
||||||
|
PkgConfig::GIO
|
||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(deepin-application-manager PUBLIC
|
target_include_directories(deepin-application-manager PUBLIC
|
||||||
PkgConfig::XCB
|
PkgConfig::XCB
|
||||||
|
PkgConfig::GIO
|
||||||
../lib
|
../lib
|
||||||
../utils
|
../utils
|
||||||
../frameworkdbus
|
../frameworkdbus
|
||||||
|
@ -2,6 +2,11 @@
|
|||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <QDBusMessage>
|
||||||
|
#include <QDBusConnectionInterface>
|
||||||
|
#include <QDBusConnection>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
@ -105,7 +110,13 @@ private:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ApplicationManager::ApplicationManager(QObject *parent) : QObject(parent), dd_ptr(new ApplicationManagerPrivate(this)) {}
|
ApplicationManager::ApplicationManager(QObject *parent)
|
||||||
|
: QObject(parent)
|
||||||
|
, dd_ptr(new ApplicationManagerPrivate(this))
|
||||||
|
, startManager(new StartManager(this))
|
||||||
|
{
|
||||||
|
connect(startManager, &StartManager::autostartChanged, this, &ApplicationManager::AutostartChanged);
|
||||||
|
}
|
||||||
|
|
||||||
ApplicationManager::~ApplicationManager() {}
|
ApplicationManager::~ApplicationManager() {}
|
||||||
|
|
||||||
@ -116,15 +127,13 @@ void ApplicationManager::addApplication(const QList<QSharedPointer<Application>>
|
|||||||
d->applications = list;
|
d->applications = list;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDBusObjectPath ApplicationManager::GetId(int pid)
|
|
||||||
{
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
QDBusObjectPath ApplicationManager::GetInformation(const QString &id)
|
QDBusObjectPath ApplicationManager::GetInformation(const QString &id)
|
||||||
{
|
{
|
||||||
Q_D(ApplicationManager);
|
Q_D(ApplicationManager);
|
||||||
|
|
||||||
|
if (!checkDMsgUid())
|
||||||
|
return {};
|
||||||
|
|
||||||
for (const QSharedPointer<Application> &app : d->applications) {
|
for (const QSharedPointer<Application> &app : d->applications) {
|
||||||
if (app->id() == id) {
|
if (app->id() == id) {
|
||||||
return app->path();
|
return app->path();
|
||||||
@ -136,6 +145,8 @@ QDBusObjectPath ApplicationManager::GetInformation(const QString &id)
|
|||||||
QList<QDBusObjectPath> ApplicationManager::GetInstances(const QString &id)
|
QList<QDBusObjectPath> ApplicationManager::GetInstances(const QString &id)
|
||||||
{
|
{
|
||||||
Q_D(const ApplicationManager);
|
Q_D(const ApplicationManager);
|
||||||
|
if (!checkDMsgUid())
|
||||||
|
return {};
|
||||||
|
|
||||||
for (const auto &app : d->applications) {
|
for (const auto &app : d->applications) {
|
||||||
if (app->id() == id) {
|
if (app->id() == id) {
|
||||||
@ -149,6 +160,8 @@ QList<QDBusObjectPath> ApplicationManager::GetInstances(const QString &id)
|
|||||||
QDBusObjectPath ApplicationManager::Run(const QString &id)
|
QDBusObjectPath ApplicationManager::Run(const QString &id)
|
||||||
{
|
{
|
||||||
Q_D(ApplicationManager);
|
Q_D(ApplicationManager);
|
||||||
|
if (!checkDMsgUid())
|
||||||
|
return {};
|
||||||
|
|
||||||
// 创建一个实例
|
// 创建一个实例
|
||||||
for (const QSharedPointer<Application> &app : d->applications) {
|
for (const QSharedPointer<Application> &app : d->applications) {
|
||||||
@ -171,6 +184,102 @@ QDBusObjectPath ApplicationManager::Run(const QString &id)
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ApplicationManager::AddAutostart(QString fileName)
|
||||||
|
{
|
||||||
|
if (!checkDMsgUid())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return startManager->addAutostart(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApplicationManager::RemoveAutostart(QString fileName)
|
||||||
|
{
|
||||||
|
if (!checkDMsgUid())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return startManager->removeAutostart(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList ApplicationManager::AutostartList()
|
||||||
|
{
|
||||||
|
if (!checkDMsgUid())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
return startManager->autostartList();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ApplicationManager::DumpMemRecord()
|
||||||
|
{
|
||||||
|
if (!checkDMsgUid())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
return startManager->dumpMemRecord();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApplicationManager::IsAutostart(QString fileName)
|
||||||
|
{
|
||||||
|
if (!checkDMsgUid())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return startManager->isAutostart(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ApplicationManager::IsMemSufficient()
|
||||||
|
{
|
||||||
|
if (!checkDMsgUid())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return startManager->isMemSufficient();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplicationManager::LaunchApp(QString desktopFile, uint32_t timestamp, QStringList files)
|
||||||
|
{
|
||||||
|
if (!checkDMsgUid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
startManager->launchApp(desktopFile, timestamp, files);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplicationManager::LaunchAppAction(QString desktopFile, QString action, uint32_t timestamp)
|
||||||
|
{
|
||||||
|
if (!checkDMsgUid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
startManager->launchAppAction(desktopFile, action, timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplicationManager::LaunchAppWithOptions(QString desktopFile, uint32_t timestamp, QStringList files, QMap<QString, QString> options)
|
||||||
|
{
|
||||||
|
if (!checkDMsgUid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
startManager->launchAppWithOptions(desktopFile, timestamp, files, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplicationManager::RunCommand(QString exe, QStringList args)
|
||||||
|
{
|
||||||
|
if (!checkDMsgUid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
startManager->runCommand(exe, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplicationManager::RunCommandWithOptions(QString exe, QStringList args, QMap<QString, QString> options)
|
||||||
|
{
|
||||||
|
if (!checkDMsgUid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
startManager->runCommandWithOptions(exe, args, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplicationManager::TryAgain(bool launch)
|
||||||
|
{
|
||||||
|
if (!checkDMsgUid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
startManager->tryAgain(launch);
|
||||||
|
}
|
||||||
|
|
||||||
QList<QDBusObjectPath> ApplicationManager::instances() const
|
QList<QDBusObjectPath> ApplicationManager::instances() const
|
||||||
{
|
{
|
||||||
Q_D(const ApplicationManager);
|
Q_D(const ApplicationManager);
|
||||||
@ -196,4 +305,10 @@ QList<QDBusObjectPath> ApplicationManager::list() const
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ApplicationManager::checkDMsgUid()
|
||||||
|
{
|
||||||
|
QDBusReply<uint> reply = connection().interface()->serviceUid(message().service());
|
||||||
|
return reply.isValid() && (reply.value() == getuid());
|
||||||
|
}
|
||||||
|
|
||||||
#include "application_manager.moc"
|
#include "application_manager.moc"
|
||||||
|
@ -1,14 +1,19 @@
|
|||||||
#ifndef A2862DC7_5DA3_4129_9796_671D88015BED
|
#ifndef A2862DC7_5DA3_4129_9796_671D88015BED
|
||||||
#define A2862DC7_5DA3_4129_9796_671D88015BED
|
#define A2862DC7_5DA3_4129_9796_671D88015BED
|
||||||
|
|
||||||
|
#include "../../modules/startmanager/startmanager.h"
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QDBusObjectPath>
|
#include <QDBusObjectPath>
|
||||||
#include <QList>
|
#include <QList>
|
||||||
|
#include <QMap>
|
||||||
|
#include <QDBusContext>
|
||||||
|
|
||||||
class Application;
|
class Application;
|
||||||
class ApplicationInstance;
|
class ApplicationInstance;
|
||||||
class ApplicationManagerPrivate;
|
class ApplicationManagerPrivate;
|
||||||
class ApplicationManager : public QObject {
|
class ApplicationManager : public QObject, public QDBusContext
|
||||||
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(QList<QDBusObjectPath> instances READ instances)
|
Q_PROPERTY(QList<QDBusObjectPath> instances READ instances)
|
||||||
Q_PROPERTY(QList<QDBusObjectPath> list READ list)
|
Q_PROPERTY(QList<QDBusObjectPath> list READ list)
|
||||||
@ -16,6 +21,9 @@ class ApplicationManager : public QObject {
|
|||||||
Q_DECLARE_PRIVATE_D(qGetPtrHelper(dd_ptr), ApplicationManager)
|
Q_DECLARE_PRIVATE_D(qGetPtrHelper(dd_ptr), ApplicationManager)
|
||||||
|
|
||||||
ApplicationManager(QObject *parent = nullptr);
|
ApplicationManager(QObject *parent = nullptr);
|
||||||
|
bool checkDMsgUid();
|
||||||
|
|
||||||
|
StartManager *startManager;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
~ApplicationManager() override;
|
~ApplicationManager() override;
|
||||||
@ -26,18 +34,34 @@ public:
|
|||||||
|
|
||||||
void addApplication(const QList<QSharedPointer<Application>> &list);
|
void addApplication(const QList<QSharedPointer<Application>> &list);
|
||||||
|
|
||||||
signals:
|
Q_SIGNALS:
|
||||||
void requestCreateInstance(const QSharedPointer<ApplicationInstance> instance);
|
void AutostartChanged(QString status, QString filePath);
|
||||||
|
|
||||||
public: // PROPERTIES
|
public: // PROPERTIES
|
||||||
QList<QDBusObjectPath> instances() const;
|
QList<QDBusObjectPath> instances() const;
|
||||||
QList<QDBusObjectPath> list() const;
|
QList<QDBusObjectPath> list() const;
|
||||||
|
|
||||||
public Q_SLOTS: // METHODS
|
public Q_SLOTS: // METHODS
|
||||||
QDBusObjectPath GetId(int pid);
|
|
||||||
QDBusObjectPath GetInformation(const QString &id);
|
QDBusObjectPath GetInformation(const QString &id);
|
||||||
QList<QDBusObjectPath> GetInstances(const QString &id);
|
QList<QDBusObjectPath> GetInstances(const QString &id);
|
||||||
QDBusObjectPath Run(const QString &id);
|
QDBusObjectPath Run(const QString &id);
|
||||||
|
|
||||||
|
// com.deepin.StartManager
|
||||||
|
bool AddAutostart(QString fileName);
|
||||||
|
bool RemoveAutostart(QString fileName);
|
||||||
|
QStringList AutostartList();
|
||||||
|
QString DumpMemRecord();
|
||||||
|
//QString GetApps();
|
||||||
|
bool IsAutostart(QString fileName);
|
||||||
|
bool IsMemSufficient();
|
||||||
|
//bool Launch(QString desktopFile); deprecated
|
||||||
|
void LaunchApp(QString desktopFile, uint32_t timestamp, QStringList files);
|
||||||
|
void LaunchAppAction(QString desktopFile, QString action, uint32_t timestamp);
|
||||||
|
void LaunchAppWithOptions(QString desktopFile, uint32_t timestamp, QStringList files, QMap<QString, QString> options);
|
||||||
|
//bool LaunchWithTimestamp(QString desktopFile, uint32_t timestamp); deprecated
|
||||||
|
void RunCommand(QString exe, QStringList args);
|
||||||
|
void RunCommandWithOptions(QString exe, QStringList args, QMap<QString, QString> options);
|
||||||
|
void TryAgain(bool launch);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* A2862DC7_5DA3_4129_9796_671D88015BED */
|
#endif /* A2862DC7_5DA3_4129_9796_671D88015BED */
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include "../modules/apps/appmanager.h"
|
#include "../modules/apps/appmanager.h"
|
||||||
#include "../modules/launcher/launchermanager.h"
|
#include "../modules/launcher/launchermanager.h"
|
||||||
#include "../modules/dock/dockmanager.h"
|
#include "../modules/dock/dockmanager.h"
|
||||||
|
#include "../modules/startmanager/startmanager.h"
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <DLog>
|
#include <DLog>
|
||||||
@ -74,6 +75,7 @@ int main(int argc, char *argv[])
|
|||||||
new AppManager(ApplicationManager::Instance());
|
new AppManager(ApplicationManager::Instance());
|
||||||
new LauncherManager(ApplicationManager::Instance());
|
new LauncherManager(ApplicationManager::Instance());
|
||||||
new DockManager(ApplicationManager::Instance());
|
new DockManager(ApplicationManager::Instance());
|
||||||
|
new StartManager(ApplicationManager::Instance());
|
||||||
new ApplicationManagerAdaptor(ApplicationManager::Instance());
|
new ApplicationManagerAdaptor(ApplicationManager::Instance());
|
||||||
|
|
||||||
QDBusConnection::sessionBus().registerService("org.desktopspec.Application");
|
QDBusConnection::sessionBus().registerService("org.desktopspec.Application");
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
* Copyright (C) 2021 ~ 2022 Deepin Technology Co., Ltd.
|
||||||
*
|
*
|
||||||
* Author: weizhixiang <weizhixiang@uniontech.com>
|
* Author: weizhixiang <weizhixiang@uniontech.com>
|
||||||
*
|
*
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user