You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
2.3 KiB
114 lines
2.3 KiB
/**
|
|
* EndSessionDialogAware module
|
|
*
|
|
* @author Deminder <tremminder@gmail.com>
|
|
* @copyright 2021
|
|
* @license GNU General Public License v3.0
|
|
*/
|
|
/* exported register, unregister, load, unload */
|
|
const ExtensionUtils = imports.misc.extensionUtils;
|
|
const Me = ExtensionUtils.getCurrentExtension();
|
|
const { Convenience } = Me.imports.lib;
|
|
const { Gio } = imports.gi;
|
|
const { loadInterfaceXML } = imports.misc.fileUtils;
|
|
const { proxyPromise, logDebug } = Convenience;
|
|
|
|
const EndSessionDialogInf = loadInterfaceXML(
|
|
'org.gnome.SessionManager.EndSessionDialog'
|
|
);
|
|
const EndSessionDialogProxy =
|
|
Gio.DBusProxy.makeProxyWrapper(EndSessionDialogInf);
|
|
|
|
let endSessionDialog = null;
|
|
let onCancelAction = null;
|
|
let registered = false;
|
|
|
|
/**
|
|
*
|
|
*/
|
|
function unregister() {
|
|
registered = false;
|
|
}
|
|
/**
|
|
*
|
|
*/
|
|
function register() {
|
|
registered = true;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param cancelAction
|
|
*/
|
|
function load(cancelAction) {
|
|
onCancelAction = cancelAction;
|
|
_update();
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
function unload() {
|
|
onCancelAction = null;
|
|
_update();
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
async function _update() {
|
|
try {
|
|
if (onCancelAction && !endSessionDialog) {
|
|
endSessionDialog = await proxyPromise(
|
|
EndSessionDialogProxy,
|
|
Gio.DBus.session,
|
|
'org.gnome.Shell',
|
|
'/org/gnome/SessionManager/EndSessionDialog'
|
|
);
|
|
}
|
|
if (endSessionDialog) {
|
|
if (onCancelAction === null) {
|
|
_disconnect(endSessionDialog);
|
|
endSessionDialog = null;
|
|
} else {
|
|
_connect(endSessionDialog, onCancelAction);
|
|
}
|
|
}
|
|
} catch (err) {
|
|
logError(err, 'EndSessionDialogProxyError');
|
|
endSessionDialog = null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param dialog
|
|
* @param cancelAction
|
|
*/
|
|
function _connect(dialog, cancelAction) {
|
|
if (!('_cancelSignalId' in dialog)) {
|
|
logDebug('Connect cancel of endSessionDialog...');
|
|
dialog['_cancelSignalId'] = dialog.connectSignal('Canceled', () => {
|
|
logDebug(
|
|
`endSessionDialog cancel triggered. propagate registered: ${registered}`
|
|
);
|
|
if (registered) {
|
|
cancelAction();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param dialog
|
|
*/
|
|
function _disconnect(dialog) {
|
|
const signalId = dialog['_cancelSignalId'];
|
|
if (signalId) {
|
|
logDebug('Disconnect cancel of endSessionDialog...');
|
|
dialog.disconnectSignal(signalId);
|
|
delete dialog['_cancelSignalId'];
|
|
}
|
|
}
|