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,38 @@ 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 scopeX11Only :
58+ return ! isWayland
59+ case scopeWaylandOnly :
60+ return isWayland
61+ case scopeAlways :
62+ return true
63+ default :
64+ return ! isWayland
65+ }
66+ }
67+
68+ func getTraySelectionManagerScope () string {
69+ trayIconDConfig , err := dconfig .NewDConfig (dconfigAppID , dconfigTrayIconID , "" )
70+ if err != nil {
71+ logger .Warning ("failed to create trayicon dconfig:" , err )
72+ return scopeNever
73+ }
74+
75+ scope , err := trayIconDConfig .GetValueString (dconfigKeyTraySelectionScope )
76+ if err != nil {
77+ logger .Warning ("failed to get tray selection manager scope:" , err )
78+ return scopeNever
79+ }
80+
81+ return scope
82+ }
83+
4084func (d * Daemon ) Start () error {
4185 var err error
4286 service := loader .GetService ()
@@ -48,8 +92,10 @@ func (d *Daemon) Start() error {
4892 d .sigLoop = dbusutil .NewSignalLoop (sessionBus , 10 )
4993 d .sigLoop .Start ()
5094
51- if os .Getenv ("XDG_SESSION_TYPE" ) != "wayland" {
52- // init x conn
95+ // Enable this on both x11 and wayland(for xwayland support)
96+ // #region init x conn
97+ scope := getTraySelectionManagerScope ()
98+ if shouldRegisterTraySelectionManager (scope ) {
5399 XConn , err = x .NewConn ()
54100 if err != nil {
55101 return err
@@ -79,6 +125,7 @@ func (d *Daemon) Start() error {
79125 return err
80126 }
81127 }
128+ // #endregion
82129
83130 if os .Getenv ("DDE_DISABLE_STATUS_NOTIFIER_WATCHER" ) != "1" {
84131 d .snw = newStatusNotifierWatcher (service , d .sigLoop )
0 commit comments