1- // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd.
1+ // SPDX-FileCopyrightText: 2018 - 2026 UnionTech Software Technology Co., Ltd.
22//
33// SPDX-License-Identifier: GPL-3.0-or-later
44
55package trayicon
66
77import (
8- "github.com/godbus/dbus/v5"
98 "os"
109
10+ "github.com/godbus/dbus/v5"
11+ "github.com/linuxdeepin/dde-daemon/common/dconfig"
1112 "github.com/linuxdeepin/dde-daemon/loader"
1213 "github.com/linuxdeepin/go-lib/dbusutil"
1314 "github.com/linuxdeepin/go-lib/log"
@@ -23,6 +24,17 @@ type Daemon struct {
2324
2425const moduleName = "trayicon"
2526
27+ const (
28+ dconfigAppID = "org.deepin.dde.daemon"
29+ dconfigTrayIconID = "org.deepin.dde.daemon.trayicon"
30+ dconfigKeyTraySelectionScope = "traySelectionManagerScope"
31+
32+ scopeNever = "never"
33+ scopeX11Only = "x11-only"
34+ scopeWaylandOnly = "wayland-only"
35+ scopeAlways = "always"
36+ )
37+
2638func NewDaemon (logger * log.Logger ) * Daemon {
2739 daemon := new (Daemon )
2840 daemon .ModuleBase = loader .NewModuleBase (moduleName , daemon , logger )
@@ -37,6 +49,40 @@ func (d *Daemon) Name() string {
3749 return moduleName
3850}
3951
52+ func shouldRegisterTraySelectionManager (scope string ) bool {
53+ sessionType := os .Getenv ("XDG_SESSION_TYPE" )
54+ isWayland := sessionType == "wayland"
55+
56+ switch scope {
57+ case scopeNever :
58+ return false
59+ case scopeX11Only :
60+ return ! isWayland
61+ case scopeWaylandOnly :
62+ return isWayland
63+ case scopeAlways :
64+ return true
65+ default :
66+ return ! isWayland
67+ }
68+ }
69+
70+ func getTraySelectionManagerScope () string {
71+ trayIconDConfig , err := dconfig .NewDConfig (dconfigAppID , dconfigTrayIconID , "" )
72+ if err != nil {
73+ logger .Warning ("failed to create trayicon dconfig:" , err )
74+ return scopeNever
75+ }
76+
77+ scope , err := trayIconDConfig .GetValueString (dconfigKeyTraySelectionScope )
78+ if err != nil {
79+ logger .Warning ("failed to get tray selection manager scope:" , err )
80+ return scopeNever
81+ }
82+
83+ return scope
84+ }
85+
4086func (d * Daemon ) Start () error {
4187 var err error
4288 service := loader .GetService ()
@@ -48,8 +94,10 @@ func (d *Daemon) Start() error {
4894 d .sigLoop = dbusutil .NewSignalLoop (sessionBus , 10 )
4995 d .sigLoop .Start ()
5096
51- if os .Getenv ("XDG_SESSION_TYPE" ) != "wayland" {
52- // init x conn
97+ // Enable this on both x11 and wayland(for xwayland support)
98+ // #region init x conn
99+ scope := getTraySelectionManagerScope ()
100+ if shouldRegisterTraySelectionManager (scope ) {
53101 XConn , err = x .NewConn ()
54102 if err != nil {
55103 return err
@@ -79,6 +127,7 @@ func (d *Daemon) Start() error {
79127 return err
80128 }
81129 }
130+ // #endregion
82131
83132 if os .Getenv ("DDE_DISABLE_STATUS_NOTIFIER_WATCHER" ) != "1" {
84133 d .snw = newStatusNotifierWatcher (service , d .sigLoop )
0 commit comments