@@ -71,32 +71,10 @@ func (m *Manager) initializeScreensaver() error {
7171
7272 handler := & screensaverHandler {manager : m }
7373
74- // Try to claim org.freedesktop.ScreenSaver (may fail if the compositor
75- // or another process already owns this name).
76- if reply , err := m .sessionConn .RequestName (dbusScreensaverName , dbus .NameFlagDoNotQueue ); err != nil {
77- log .Warnf ("Failed to request screensaver name %s: %v" , dbusScreensaverName , err )
78- } else if reply != dbus .RequestNameReplyPrimaryOwner {
79- log .Warnf ("Screensaver name %s already owned by another process" , dbusScreensaverName )
80- } else if err := m .exportScreensaverOnPaths (handler , dbusScreensaverInterface ,
81- dbusScreensaverPath , dbusScreensaverPath2 ); err != nil {
82- log .Warnf ("Failed to export freedesktop screensaver: %v" , err )
83- } else {
84- m .screensaverFreedesktopClaimed = true
85- log .Infof ("Claimed %s on session bus" , dbusScreensaverName )
86- }
87-
88- // Try to claim org.gnome.ScreenSaver independently as a fallback.
89- if reply , err := m .sessionConn .RequestName (dbusGnomeScreensaverName , dbus .NameFlagDoNotQueue ); err != nil {
90- log .Warnf ("Failed to request screensaver name %s: %v" , dbusGnomeScreensaverName , err )
91- } else if reply != dbus .RequestNameReplyPrimaryOwner {
92- log .Warnf ("Screensaver name %s already owned by another process" , dbusGnomeScreensaverName )
93- } else if err := m .exportScreensaverOnPaths (handler , dbusGnomeScreensaverInterface ,
94- dbusGnomeScreensaverPath ); err != nil {
95- log .Warnf ("Failed to export gnome screensaver: %v" , err )
96- } else {
97- m .screensaverGnomeClaimed = true
98- log .Infof ("Claimed %s on session bus" , dbusGnomeScreensaverName )
99- }
74+ m .screensaverFreedesktopClaimed = m .claimScreensaverName (handler ,
75+ dbusScreensaverName , dbusScreensaverInterface , dbusScreensaverPath , dbusScreensaverPath2 )
76+ m .screensaverGnomeClaimed = m .claimScreensaverName (handler ,
77+ dbusGnomeScreensaverName , dbusGnomeScreensaverInterface , dbusGnomeScreensaverPath )
10078
10179 if ! m .screensaverFreedesktopClaimed && ! m .screensaverGnomeClaimed {
10280 log .Warn ("No screensaver interface could be claimed" )
@@ -119,6 +97,24 @@ func (m *Manager) initializeScreensaver() error {
11997 return nil
12098}
12199
100+ func (m * Manager ) claimScreensaverName (handler * screensaverHandler , name , iface string , paths ... dbus.ObjectPath ) bool {
101+ reply , err := m .sessionConn .RequestName (name , dbus .NameFlagDoNotQueue )
102+ if err != nil {
103+ log .Warnf ("Failed to request screensaver name %s: %v" , name , err )
104+ return false
105+ }
106+ if reply != dbus .RequestNameReplyPrimaryOwner {
107+ log .Warnf ("Screensaver name %s already owned by another process" , name )
108+ return false
109+ }
110+ if err := m .exportScreensaverOnPaths (handler , iface , paths ... ); err != nil {
111+ log .Warnf ("Failed to export screensaver on %s: %v" , name , err )
112+ return false
113+ }
114+ log .Infof ("Claimed %s on session bus" , name )
115+ return true
116+ }
117+
122118// exportScreensaverOnPaths exports the handler and introspection on the given
123119// paths under the specified interface name.
124120func (m * Manager ) exportScreensaverOnPaths (handler * screensaverHandler , ifaceName string , paths ... dbus.ObjectPath ) error {
@@ -321,8 +317,6 @@ func (h *screensaverHandler) Lock() *dbus.Error {
321317 return nil
322318}
323319
324- // SetScreenLockActive updates the screensaver active (locked) state and emits
325- // ActiveChanged on all claimed session bus interfaces.
326320func (m * Manager ) SetScreenLockActive (active bool ) {
327321 m .stateMutex .Lock ()
328322 changed := m .state .Screensaver .Active != active
@@ -334,22 +328,22 @@ func (m *Manager) SetScreenLockActive(active bool) {
334328 }
335329
336330 log .Infof ("Screen lock active changed: %v" , active )
331+ defer m .NotifyScreensaverSubscribers ()
337332
338- if m .sessionConn != nil {
339- if m .screensaverFreedesktopClaimed {
340- if err := m .sessionConn .Emit (dbusScreensaverPath , dbusScreensaverInterface + ".ActiveChanged" , active ); err != nil {
341- log .Warnf ("Failed to emit ActiveChanged on %s: %v" , dbusScreensaverPath , err )
342- }
343- if err := m .sessionConn .Emit (dbusScreensaverPath2 , dbusScreensaverInterface + ".ActiveChanged" , active ); err != nil {
344- log .Warnf ("Failed to emit ActiveChanged on %s: %v" , dbusScreensaverPath2 , err )
345- }
333+ if m .sessionConn == nil {
334+ return
335+ }
336+ if m .screensaverFreedesktopClaimed {
337+ if err := m .sessionConn .Emit (dbusScreensaverPath , dbusScreensaverInterface + ".ActiveChanged" , active ); err != nil {
338+ log .Warnf ("Failed to emit ActiveChanged on %s: %v" , dbusScreensaverPath , err )
346339 }
347- if m .screensaverGnomeClaimed {
348- if err := m .sessionConn .Emit (dbusGnomeScreensaverPath , dbusGnomeScreensaverInterface + ".ActiveChanged" , active ); err != nil {
349- log .Warnf ("Failed to emit ActiveChanged on %s: %v" , dbusGnomeScreensaverPath , err )
350- }
340+ if err := m .sessionConn .Emit (dbusScreensaverPath2 , dbusScreensaverInterface + ".ActiveChanged" , active ); err != nil {
341+ log .Warnf ("Failed to emit ActiveChanged on %s: %v" , dbusScreensaverPath2 , err )
342+ }
343+ }
344+ if m .screensaverGnomeClaimed {
345+ if err := m .sessionConn .Emit (dbusGnomeScreensaverPath , dbusGnomeScreensaverInterface + ".ActiveChanged" , active ); err != nil {
346+ log .Warnf ("Failed to emit ActiveChanged on %s: %v" , dbusGnomeScreensaverPath , err )
351347 }
352348 }
353-
354- m .NotifyScreensaverSubscribers ()
355349}
0 commit comments