!39 [sync] PR-38: Fix-the-system-monitor-displaying-a-scene
From: @openeuler-sync-bot Reviewed-by: @HelloWorld_lvcongqing Signed-off-by: @HelloWorld_lvcongqing
This commit is contained in:
commit
953a456ed4
317
0001-Fix-the-system-monitor-displaying-a-scene.patch
Normal file
317
0001-Fix-the-system-monitor-displaying-a-scene.patch
Normal file
@ -0,0 +1,317 @@
|
|||||||
|
From 01c17723fa4f91c40ac946e9d02bd55be85c1f75 Mon Sep 17 00:00:00 2001
|
||||||
|
From: yangxianzhao <yangxianzhao@uniontech.com>
|
||||||
|
Date: Thu, 6 Apr 2023 10:06:18 +0800
|
||||||
|
Subject: [PATCH] Fix-the-system-monitor-displaying-a-scene
|
||||||
|
|
||||||
|
---
|
||||||
|
dock/dock_manager_entries.go | 3 +-
|
||||||
|
dock/dock_manager_xevent.go | 13 ++++---
|
||||||
|
dock/identify_window.go | 70 ++++++++++++++++++++++++------------
|
||||||
|
3 files changed, 58 insertions(+), 28 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/dock/dock_manager_entries.go b/dock/dock_manager_entries.go
|
||||||
|
index ad758c8..bf4c1d5 100644
|
||||||
|
--- a/dock/dock_manager_entries.go
|
||||||
|
+++ b/dock/dock_manager_entries.go
|
||||||
|
@@ -83,6 +83,7 @@ func (m *Manager) attachOrDetachWindow(winInfo *WindowInfo) {
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if winInfo.entryInnerId == "" {
|
||||||
|
+ logger.Debugf("winInfo.entryInnerId is empty, call identifyWindow, win: %d", winInfo.window)
|
||||||
|
winInfo.entryInnerId, winInfo.appInfo = m.identifyWindow(winInfo)
|
||||||
|
m.markAppLaunched(winInfo.appInfo)
|
||||||
|
} else {
|
||||||
|
@@ -173,7 +174,7 @@ func (m *Manager) attachWindow(winInfo *WindowInfo) {
|
||||||
|
func (m *Manager) detachWindow(winInfo *WindowInfo) {
|
||||||
|
entry := m.Entries.getByWindowId(winInfo.window)
|
||||||
|
if entry == nil {
|
||||||
|
- logger.Warningf("entry of window '%x' is nil", winInfo.window)
|
||||||
|
+ logger.Warningf("entry of window %d is nil", winInfo.window)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
needRemove := entry.detachWindow(winInfo)
|
||||||
|
diff --git a/dock/dock_manager_xevent.go b/dock/dock_manager_xevent.go
|
||||||
|
index 17468bf..c67a776 100644
|
||||||
|
--- a/dock/dock_manager_xevent.go
|
||||||
|
+++ b/dock/dock_manager_xevent.go
|
||||||
|
@@ -21,6 +21,7 @@ package dock
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sort"
|
||||||
|
+ "strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
x "github.com/linuxdeepin/go-x11-client"
|
||||||
|
@@ -76,12 +77,13 @@ func (m *Manager) handleClientListChanged() {
|
||||||
|
for _, win := range add {
|
||||||
|
window0 := win
|
||||||
|
addFunc := func() {
|
||||||
|
- logger.Debugf("client list add: %x", window0)
|
||||||
|
+ logger.Debugf("client list add: %d", window0)
|
||||||
|
winInfo := m.registerWindow(window0)
|
||||||
|
logger.Infof("%v", m.windowInfoMap)
|
||||||
|
repeatCount := 0
|
||||||
|
for {
|
||||||
|
if repeatCount > 10 {
|
||||||
|
+ logger.Debugf("give up identify window %d", window0)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
good := isGoodWindow(window0)
|
||||||
|
@@ -90,7 +92,9 @@ func (m *Manager) handleClientListChanged() {
|
||||||
|
}
|
||||||
|
pid := getWmPid(window0)
|
||||||
|
wmClass, _ := getWmClass(window0)
|
||||||
|
- if pid != 0 || wmClass != nil {
|
||||||
|
+ wmName := getWmName(window0)
|
||||||
|
+ wmCmd, _ := getWmCommand(window0)
|
||||||
|
+ if pid != 0 || wmClass != nil || wmName != "" || strings.Join(wmCmd, "") != "" {
|
||||||
|
m.attachOrDetachWindow(winInfo)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
@@ -106,7 +110,7 @@ func (m *Manager) handleClientListChanged() {
|
||||||
|
for _, win := range remove {
|
||||||
|
window0 := win
|
||||||
|
removeFunc := func() {
|
||||||
|
- logger.Debugf("client list remove: %x", window0)
|
||||||
|
+ logger.Debugf("client list remove: %d", window0)
|
||||||
|
m.windowInfoMapMutex.RLock()
|
||||||
|
logger.Infof("%v", m.windowInfoMap)
|
||||||
|
winInfo := m.windowInfoMap[window0]
|
||||||
|
@@ -115,7 +119,7 @@ func (m *Manager) handleClientListChanged() {
|
||||||
|
m.detachWindow(winInfo)
|
||||||
|
winInfo.entryInnerId = ""
|
||||||
|
} else {
|
||||||
|
- logger.Warningf("window info of '%x' is nil", window0)
|
||||||
|
+ logger.Warningf("window info of %d is nil", window0)
|
||||||
|
entry := m.Entries.getByWindowId(window0)
|
||||||
|
m.removeAppEntry(entry)
|
||||||
|
}
|
||||||
|
@@ -198,6 +202,7 @@ func (m *Manager) handleMapNotifyEvent(ev *x.MapNotifyEvent) {
|
||||||
|
logger.Debug("MapNotifyEvent window:", ev.Window)
|
||||||
|
winInfo := m.registerWindow(ev.Window)
|
||||||
|
time.AfterFunc(2*time.Second, func() {
|
||||||
|
+ logger.Warningf("mapNotifyEvent after 2s, call identifyWindow, win: %d", winInfo.window)
|
||||||
|
_, appInfo := m.identifyWindow(winInfo)
|
||||||
|
m.markAppLaunched(appInfo)
|
||||||
|
})
|
||||||
|
diff --git a/dock/identify_window.go b/dock/identify_window.go
|
||||||
|
index 9b433ed..e4f178e 100644
|
||||||
|
--- a/dock/identify_window.go
|
||||||
|
+++ b/dock/identify_window.go
|
||||||
|
@@ -20,9 +20,11 @@
|
||||||
|
package dock
|
||||||
|
|
||||||
|
import (
|
||||||
|
+ "fmt"
|
||||||
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
+ "time"
|
||||||
|
|
||||||
|
"pkg.deepin.io/lib/procfs"
|
||||||
|
)
|
||||||
|
@@ -59,18 +61,18 @@ func (m *Manager) identifyWindow(winInfo *WindowInfo) (innerId string, appInfo *
|
||||||
|
logger.Debugf("identifyWindow: window id: %v, window innerId: %q",
|
||||||
|
winInfo.window, winInfo.innerId)
|
||||||
|
if winInfo.innerId == "" {
|
||||||
|
- logger.Debug("identifyWindow: winInfo.innerId is empty")
|
||||||
|
+ logger.Debugf("identifyWindow: win %d winInfo.innerId is empty", winInfo.window)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for idx, item := range m.identifyWindowFuns {
|
||||||
|
name := item.Name
|
||||||
|
- logger.Debugf("identifyWindow: try %s:%d", name, idx)
|
||||||
|
+ logger.Debugf("identifyWindow %d try %s:%d", winInfo.window, name, idx)
|
||||||
|
innerId, appInfo = item.Fn(m, winInfo)
|
||||||
|
if innerId != "" {
|
||||||
|
// success
|
||||||
|
- logger.Debugf("identifyWindow by %s success, innerId: %q, appInfo: %v",
|
||||||
|
- name, innerId, appInfo)
|
||||||
|
+ logger.Debugf("identifyWindow %d by %s success, innerId: %q, appInfo: %v",
|
||||||
|
+ winInfo.window, name, innerId, appInfo)
|
||||||
|
// NOTE: if name == "Pid", appInfo may be nil
|
||||||
|
if appInfo != nil {
|
||||||
|
fixedAppInfo := fixAutostartAppInfo(appInfo)
|
||||||
|
@@ -101,8 +103,9 @@ func fixAutostartAppInfo(appInfo *AppInfo) *AppInfo {
|
||||||
|
}
|
||||||
|
|
||||||
|
func identifyWindowByScratch(m *Manager, winInfo *WindowInfo) (string, *AppInfo) {
|
||||||
|
+ msgPrefix := fmt.Sprintf("identifyWindowByScratch win: %d ", winInfo.window)
|
||||||
|
desktopFile := filepath.Join(scratchDir, addDesktopExt(winInfo.innerId))
|
||||||
|
- logger.Debugf("try scratch desktop file: %q", desktopFile)
|
||||||
|
+ logger.Debugf("%s try scratch desktop file: %q", msgPrefix, desktopFile)
|
||||||
|
appInfo := NewAppInfoFromFile(desktopFile)
|
||||||
|
if appInfo != nil {
|
||||||
|
// success
|
||||||
|
@@ -113,8 +116,9 @@ func identifyWindowByScratch(m *Manager, winInfo *WindowInfo) (string, *AppInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
func identifyWindowByPid(m *Manager, winInfo *WindowInfo) (string, *AppInfo) {
|
||||||
|
+ msgPrefix := fmt.Sprintf("identifyWindowByPid win: %d ", winInfo.window)
|
||||||
|
if winInfo.pid > 10 {
|
||||||
|
- logger.Debugf("identifyWindowByPid: pid: %d", winInfo.pid)
|
||||||
|
+ logger.Debugf("%s pid: %d", msgPrefix, winInfo.pid)
|
||||||
|
entry := m.Entries.GetByWindowPid(winInfo.pid)
|
||||||
|
if entry != nil {
|
||||||
|
// success
|
||||||
|
@@ -126,8 +130,9 @@ func identifyWindowByPid(m *Manager, winInfo *WindowInfo) (string, *AppInfo) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func identifyWindowByGtkAppId(m *Manager, winInfo *WindowInfo) (string, *AppInfo) {
|
||||||
|
+ msgPrefix := fmt.Sprintf("identifyWindowByGtkAppId win: %d ", winInfo.window)
|
||||||
|
gtkAppId := winInfo.gtkAppId
|
||||||
|
- logger.Debugf("identifyWindowByGtkAppId: gtkAppId: %q", gtkAppId)
|
||||||
|
+ logger.Debugf("%s gtkAppId: %q", msgPrefix, gtkAppId)
|
||||||
|
if gtkAppId != "" {
|
||||||
|
appInfo := NewAppInfo(gtkAppId)
|
||||||
|
if appInfo != nil {
|
||||||
|
@@ -140,8 +145,9 @@ func identifyWindowByGtkAppId(m *Manager, winInfo *WindowInfo) (string, *AppInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func identifyWindowByFlatpakAppID(m *Manager, winInfo *WindowInfo) (string, *AppInfo) {
|
||||||
|
+ msgPrefix := fmt.Sprintf("identifyWindowByFlatpakAppID win: %d ", winInfo.window)
|
||||||
|
flatpakRef := winInfo.flatpakAppID
|
||||||
|
- logger.Debugf("identifyWindowByFlatpakAppID: flatpak ref is %q", flatpakRef)
|
||||||
|
+ logger.Debugf("%s flatpak ref is %q", msgPrefix, flatpakRef)
|
||||||
|
if strings.HasPrefix(flatpakRef, "app/") {
|
||||||
|
parts := strings.Split(flatpakRef, "/")
|
||||||
|
if len(parts) > 1 {
|
||||||
|
@@ -204,12 +210,13 @@ var crxAppIdMap = map[string]string{
|
||||||
|
}
|
||||||
|
|
||||||
|
func identifyWindowByCrxId(m *Manager, winInfo *WindowInfo) (string, *AppInfo) {
|
||||||
|
+ msgPrefix := fmt.Sprintf("identifyWindowByCrxId win: %d ", winInfo.window)
|
||||||
|
if winInfo.wmClass != nil &&
|
||||||
|
strings.EqualFold(winInfo.wmClass.Class, "chromium-browser") &&
|
||||||
|
strings.HasPrefix(winInfo.wmClass.Instance, "crx_") {
|
||||||
|
|
||||||
|
appId, ok := crxAppIdMap[winInfo.wmClass.Instance]
|
||||||
|
- logger.Debug("identifyWindowByCrxId", appId)
|
||||||
|
+ logger.Debug(msgPrefix, "appId:", appId)
|
||||||
|
if ok {
|
||||||
|
appInfo := NewAppInfo(appId)
|
||||||
|
if appInfo != nil {
|
||||||
|
@@ -223,6 +230,7 @@ func identifyWindowByCrxId(m *Manager, winInfo *WindowInfo) (string, *AppInfo) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func identifyWindowByCmdlineTurboBooster(m *Manager, winInfo *WindowInfo) (string, *AppInfo) {
|
||||||
|
+ msgPrefix := fmt.Sprintf("identifyWindowByCmdlineTurboBooster win: %d ", winInfo.window)
|
||||||
|
pid := winInfo.pid
|
||||||
|
process := winInfo.process
|
||||||
|
if process != nil && pid != 0 {
|
||||||
|
@@ -233,7 +241,7 @@ func identifyWindowByCmdlineTurboBooster(m *Manager, winInfo *WindowInfo) (strin
|
||||||
|
} else if strings.Contains(process.cmdline[0], "/applications/") {
|
||||||
|
matches, err := filepath.Glob(process.cmdline[0] + "*")
|
||||||
|
if err != nil {
|
||||||
|
- logger.Warning("filepath.Glob err:", err)
|
||||||
|
+ logger.Warning(msgPrefix, "filepath.Glob err:", err)
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
if len(matches) > 0 && strings.HasSuffix(matches[0], desktopExt) {
|
||||||
|
@@ -242,7 +250,7 @@ func identifyWindowByCmdlineTurboBooster(m *Manager, winInfo *WindowInfo) (strin
|
||||||
|
}
|
||||||
|
|
||||||
|
if desktopFile != "" {
|
||||||
|
- logger.Debugf("identifyWindowByCmdlineTurboBooster: desktopFile: %s", desktopFile)
|
||||||
|
+ logger.Debugf("%s desktopFile: %s", msgPrefix, desktopFile)
|
||||||
|
appInfo := NewAppInfoFromFile(desktopFile)
|
||||||
|
if appInfo != nil {
|
||||||
|
// success
|
||||||
|
@@ -257,6 +265,7 @@ func identifyWindowByCmdlineTurboBooster(m *Manager, winInfo *WindowInfo) (strin
|
||||||
|
}
|
||||||
|
|
||||||
|
func identifyWindowByPidEnv(m *Manager, winInfo *WindowInfo) (string, *AppInfo) {
|
||||||
|
+ msgPrefix := fmt.Sprintf("identifyWindowByPidEnv win: %d ", winInfo.window)
|
||||||
|
pid := winInfo.pid
|
||||||
|
process := winInfo.process
|
||||||
|
if process != nil && pid != 0 {
|
||||||
|
@@ -264,18 +273,22 @@ func identifyWindowByPidEnv(m *Manager, winInfo *WindowInfo) (string, *AppInfo)
|
||||||
|
launchedDesktopFilePid, _ := strconv.ParseUint(
|
||||||
|
process.environ.Get("GIO_LAUNCHED_DESKTOP_FILE_PID"), 10, 32)
|
||||||
|
|
||||||
|
- logger.Debugf("identifyWindowByPidEnv: launchedDesktopFile: %q, pid: %d",
|
||||||
|
- launchedDesktopFile, launchedDesktopFilePid)
|
||||||
|
+ logger.Debugf("%s launchedDesktopFile: %q, pid: %d",
|
||||||
|
+ msgPrefix, launchedDesktopFile, launchedDesktopFilePid)
|
||||||
|
|
||||||
|
+ // 以下 2 种情况下,才能信任环境变量 GIO_LAUNCHED_DESKTOP_FILE。
|
||||||
|
+ // 1. 当窗口 pid 和 launchedDesktopFilePid 相同时;
|
||||||
|
+ // 2. 当窗口的进程的父进程 id(即 ppid)和 launchedDesktopFilePid 相同,
|
||||||
|
+ // 并且该父进程是 sh 或 bash 时。
|
||||||
|
var try bool
|
||||||
|
- if uint(launchedDesktopFilePid) == pid || process.ppid == 1 { // launchedDesktopFilePid可能被销毁,process变成孤儿进程
|
||||||
|
+ if uint(launchedDesktopFilePid) == pid {
|
||||||
|
try = true
|
||||||
|
} else if uint(launchedDesktopFilePid) == process.ppid && process.ppid != 0 {
|
||||||
|
- logger.Debug("ppid equal")
|
||||||
|
+ logger.Debug(msgPrefix, "ppid equal")
|
||||||
|
parentProcess := procfs.Process(process.ppid)
|
||||||
|
cmdline, err := parentProcess.Cmdline()
|
||||||
|
if err == nil && len(cmdline) > 0 {
|
||||||
|
- logger.Debugf("parent process cmdline: %#v", cmdline)
|
||||||
|
+ logger.Debugf("%s parent process cmdline: %#v", msgPrefix, cmdline)
|
||||||
|
base := filepath.Base(cmdline[0])
|
||||||
|
if base == "sh" || base == "bash" {
|
||||||
|
try = true
|
||||||
|
@@ -296,11 +309,12 @@ func identifyWindowByPidEnv(m *Manager, winInfo *WindowInfo) (string, *AppInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
func identifyWindowByRule(m *Manager, winInfo *WindowInfo) (string, *AppInfo) {
|
||||||
|
+ msgPrefix := fmt.Sprintf("identifyWindowByRule win: %d ", winInfo.window)
|
||||||
|
ret := m.windowPatterns.Match(winInfo)
|
||||||
|
if ret == "" {
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
- logger.Debug("identifyWindowByRule ret:", ret)
|
||||||
|
+ logger.Debug(msgPrefix, "patterns match result:", ret)
|
||||||
|
// parse ret
|
||||||
|
// id=$appId or env
|
||||||
|
var appInfo *AppInfo
|
||||||
|
@@ -356,12 +370,21 @@ func identifyWindowByWmClass(m *Manager, winInfo *WindowInfo) (string, *AppInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
func identifyWindowByBamf(m *Manager, winInfo *WindowInfo) (string, *AppInfo) {
|
||||||
|
- // bamf
|
||||||
|
+ msgPrefix := fmt.Sprintf("identifyWindowByBamf win: %d ", winInfo.window)
|
||||||
|
win := winInfo.window
|
||||||
|
- desktop, err := getDesktopFromWindowByBamf(win)
|
||||||
|
- if err != nil {
|
||||||
|
- logger.Warning(err)
|
||||||
|
- return "", nil
|
||||||
|
+ desktop := ""
|
||||||
|
+ // 重试 bamf 识别,yozo office 的窗口经常要第二次时才能识别到。
|
||||||
|
+ for i := 0; i < 3; i++ {
|
||||||
|
+ var err error
|
||||||
|
+ desktop, err = getDesktopFromWindowByBamf(win)
|
||||||
|
+ logger.Debugf("%s get desktop i: %d, desktop: %q", msgPrefix, i, desktop)
|
||||||
|
+ if err != nil {
|
||||||
|
+ logger.Warning(msgPrefix, "get desktop failed:", err)
|
||||||
|
+ }
|
||||||
|
+ if desktop != "" {
|
||||||
|
+ break
|
||||||
|
+ }
|
||||||
|
+ time.Sleep(100 * time.Millisecond)
|
||||||
|
}
|
||||||
|
|
||||||
|
if desktop != "" {
|
||||||
|
@@ -375,6 +398,7 @@ func identifyWindowByBamf(m *Manager, winInfo *WindowInfo) (string, *AppInfo) {
|
||||||
|
}
|
||||||
|
|
||||||
|
func identifyWindowByCmdlineXWalk(m *Manager, winInfo *WindowInfo) (string, *AppInfo) {
|
||||||
|
+ msgPrefix := fmt.Sprintf("identifyWindowByCmdlineXWalk win: %d ", winInfo.window)
|
||||||
|
process := winInfo.process
|
||||||
|
if process == nil || winInfo.pid == 0 {
|
||||||
|
return "", nil
|
||||||
|
@@ -386,7 +410,7 @@ func identifyWindowByCmdlineXWalk(m *Manager, winInfo *WindowInfo) (string, *App
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
lastArg := args[len(args)-1]
|
||||||
|
- logger.Debugf("lastArg: %q", lastArg)
|
||||||
|
+ logger.Debugf("%s lastArg: %q", msgPrefix, lastArg)
|
||||||
|
|
||||||
|
if filepath.Base(lastArg) == "manifest.json" {
|
||||||
|
appId := filepath.Base(filepath.Dir(lastArg))
|
||||||
|
--
|
||||||
|
2.18.4
|
||||||
|
|
||||||
@ -12,13 +12,14 @@
|
|||||||
|
|
||||||
Name: dde-daemon
|
Name: dde-daemon
|
||||||
Version: 5.13.16.11
|
Version: 5.13.16.11
|
||||||
Release: 5
|
Release: 6
|
||||||
Summary: Daemon handling the DDE session settings
|
Summary: Daemon handling the DDE session settings
|
||||||
License: GPLv3
|
License: GPLv3
|
||||||
URL: http://shuttle.corp.deepin.com/cache/tasks/18802/unstable-amd64/
|
URL: http://shuttle.corp.deepin.com/cache/tasks/18802/unstable-amd64/
|
||||||
Source0: %{name}-%{version}.orig.tar.xz
|
Source0: %{name}-%{version}.orig.tar.xz
|
||||||
Source1: vendor.tar.gz
|
Source1: vendor.tar.gz
|
||||||
Source2: %{sname}.sysusers
|
Source2: %{sname}.sysusers
|
||||||
|
Patch1: 0001-Fix-the-system-monitor-displaying-a-scene.patch
|
||||||
|
|
||||||
BuildRequires: python3
|
BuildRequires: python3
|
||||||
BuildRequires: golang
|
BuildRequires: golang
|
||||||
@ -67,7 +68,7 @@ Recommends: google-noto-sans-fonts
|
|||||||
Daemon handling the DDE session settings
|
Daemon handling the DDE session settings
|
||||||
|
|
||||||
%prep
|
%prep
|
||||||
%autosetup
|
%autosetup -p1
|
||||||
tar -xf %{SOURCE1}
|
tar -xf %{SOURCE1}
|
||||||
patch langselector/locale.go < rpm/locale.go.patch
|
patch langselector/locale.go < rpm/locale.go.patch
|
||||||
|
|
||||||
@ -183,6 +184,9 @@ fi
|
|||||||
%{_sysusersdir}/%{sname}.conf
|
%{_sysusersdir}/%{sname}.conf
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Apr 06 2023 yangxianzhao <yangxianzhao@uniontech.com> - 5.13.16.11-6
|
||||||
|
- fix: Fix-the-system-monitor-displaying-a-scene
|
||||||
|
|
||||||
* Thu Mar 16 2023 liweiganga <liweiganga@uniontech.com> - 5.13.16.11-5
|
* Thu Mar 16 2023 liweiganga <liweiganga@uniontech.com> - 5.13.16.11-5
|
||||||
- feat: fix strip
|
- feat: fix strip
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user