@@ -18,9 +18,15 @@ const Constants = Me.imports.constants;
1818
1919const UiHelper = Me . imports . ui . uiHelper ;
2020
21+ var flags = {
22+ closeWindows : 1 << 0 ,
23+ logoff : 1 << 1 ,
24+ } ;
25+
26+ var allFlags = flags . closeWindows | flags . logoff ;
2127
2228var CloseSession = class {
23- constructor ( ) {
29+ constructor ( flags ) {
2430 this . _log = new Log . Log ( ) ;
2531 this . _prefsUtils = new PrefsUtils . PrefsUtils ( ) ;
2632 this . _settings = this . _prefsUtils . getSettings ( ) ;
@@ -32,9 +38,7 @@ var CloseSession = class {
3238 flags : ( Gio . SubprocessFlags . STDOUT_PIPE |
3339 Gio . SubprocessFlags . STDERR_PIPE ) } ) ;
3440
35- // TODO Put into Settings
36- // All apps in the whitelist should be closed safely, no worrying about lost data
37- this . whitelist = [ 'org.gnome.Terminal.desktop' , 'org.gnome.Nautilus.desktop' , 'smplayer.desktop' ] ;
41+ this . flags = flags ? flags : allFlags ;
3842 }
3943
4044 async closeWindows ( workspacePersistent ) {
@@ -129,18 +133,24 @@ var CloseSession = class {
129133 let reason ;
130134 try {
131135 if ( app . get_n_windows ( ) > 1 ) {
132- const appInWhitelist = this . whitelist . includes ( app . get_id ( ) ) ;
136+ const whitelistString = this . _settings . get_string ( 'close-windows-whitelist' ) ;
137+ const whitelist = JSON . parse ( whitelistString ) ;
138+
133139 let windows = this . _sortWindows ( app ) ;
134140 for ( let i = windows . length - 1 ; i >= 0 ; i -- ) {
135141 let window = windows [ i ] ;
136- if ( ! window . can_close ( ) ) {
142+ const isInWhitelist = this . _isInWhitelist ( whitelist , window ) ;
143+ if ( isInWhitelist ) {
144+ Log . Log . getDefault ( ) . info ( `${ app . get_name ( ) } is in the whitelist` ) ;
145+ }
146+ if ( ! window . can_close ( ) && ! isInWhitelist ) {
137147 closed = false ;
138148 reason = 'it has unclosable window(s)' ;
139149 continue ;
140150 }
141151
142152 if ( UiHelper . isDialog ( window )
143- || appInWhitelist
153+ || isInWhitelist
144154 || ! this . _skip_app_with_multiple_windows )
145155 {
146156 closed = await this . _deleteWindow ( app , window ) ;
@@ -172,6 +182,27 @@ var CloseSession = class {
172182 return [ closed , reason ] ;
173183 }
174184
185+ _isInWhitelist ( whitelist , window ) {
186+ for ( const id in whitelist ) {
187+ const row = whitelist [ id ] ;
188+ const {
189+ id_, enabled, name, compareWith, method,
190+ enableWhenCloseWindows, enableWhenLogout
191+ } = row ;
192+ if ( ! enabled || ! name ) continue ;
193+
194+ let compareWithValue = Function . callFunc ( window , Meta . Window . prototype [ `get_${ compareWith } ` ] ) ;
195+ const matched = this . _ruleMatched ( compareWithValue , method , name ) ;
196+ if ( matched ) {
197+ let _flags = 0 ;
198+ if ( enableWhenCloseWindows ) _flags = _flags | flags . closeWindows ;
199+ if ( enableWhenLogout ) _flags = _flags | flags . logoff ;
200+ return true && ( this . flags & _flags ) ;
201+ }
202+ }
203+ return false ;
204+ }
205+
175206 _deleteWindow ( app , metaWindow ) {
176207 return new Promise ( ( resolve , reject ) => {
177208 // We use 'windows-changed' here because a confirm window could be popped up
@@ -360,7 +391,9 @@ var CloseSession = class {
360391 Log . Log . getDefault ( ) . debug ( `Finished to start ydotool.service. Started: ${ started } ` ) ;
361392 resolve ( started ) ;
362393 } catch ( error ) {
363- Log . Log . getDefault ( ) . error ( error , 'Failed to start ydotool.service' ) ;
394+ const msg = 'Failed to start ydotool.service' ;
395+ Log . Log . getDefault ( ) . error ( error , msg ) ;
396+ global . notify_error ( `${ msg } ` , `${ error ? error . message : '' } ` ) ;
364397 reject ( false ) ;
365398 }
366399 } ) ;
@@ -531,18 +564,6 @@ var CloseSession = class {
531564 }
532565 }
533566
534- _skip_multiple_windows ( shellApp ) {
535- if ( shellApp . get_n_windows ( ) > 1 && this . _skip_app_with_multiple_windows ) {
536- const app_id = shellApp . get_id ( ) ;
537- if ( this . whitelist . includes ( app_id ) ) {
538- this . _log . debug ( `${ shellApp . get_name ( ) } (${ app_id } ) in the whitelist. Closing it anyway.` ) ;
539- return false ;
540- }
541- return true ;
542- }
543- return false ;
544- }
545-
546567 destroy ( ) {
547568 if ( this . _defaultAppSystem ) {
548569 this . _defaultAppSystem = null ;
0 commit comments