inhibitShortcuts: Save choice in permission store

Use the permission store to remember the user's decision as to whether
or not grant the shortcuts request when the application is known.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/382
This commit is contained in:
Olivier Fourdan 2019-02-01 17:44:05 +01:00
parent 9dc99ad611
commit 32b8bc39ac

View File

@ -1,11 +1,16 @@
const { Clutter, Gio, GObject, Gtk, Meta, Shell } = imports.gi; const { Clutter, Gio, GLib, GObject, Gtk, Meta, Shell } = imports.gi;
const Dialog = imports.ui.dialog; const Dialog = imports.ui.dialog;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
const PermissionStore = imports.misc.permissionStore;
const WAYLAND_KEYBINDINGS_SCHEMA = 'org.gnome.mutter.wayland.keybindings'; const WAYLAND_KEYBINDINGS_SCHEMA = 'org.gnome.mutter.wayland.keybindings';
const APP_WHITELIST = ['gnome-control-center.desktop']; const APP_WHITELIST = ['gnome-control-center.desktop'];
const APP_PERMISSIONS_TABLE = 'gnome';
const APP_PERMISSIONS_ID = 'shortcuts-inhibitor';
const GRANTED = 'GRANTED';
const DENIED = 'DENIED';
var DialogResponse = Meta.InhibitShortcutsDialogResponse; var DialogResponse = Meta.InhibitShortcutsDialogResponse;
@ -43,6 +48,29 @@ var InhibitShortcutsDialog = GObject.registerClass({
Gtk.accelerator_parse(accel)); Gtk.accelerator_parse(accel));
} }
_shouldUsePermStore() {
return this._app && !this._app.is_window_backed();
}
_saveToPermissionStore(grant) {
if (!this._shouldUsePermStore() || this._permStore == null)
return;
let permissions = {};
permissions[this._app.get_id()] = [grant];
let data = GLib.Variant.new('av', {});
this._permStore.SetRemote(APP_PERMISSIONS_TABLE,
true,
APP_PERMISSIONS_ID,
permissions,
data,
(result, error) => {
if (error != null)
log(error.message);
});
}
_buildLayout() { _buildLayout() {
let name = this._app ? this._app.get_name() : this._window.title; let name = this._app ? this._app.get_name() : this._window.title;
@ -64,12 +92,14 @@ var InhibitShortcutsDialog = GObject.registerClass({
this._dialog.addButton({ label: _("Deny"), this._dialog.addButton({ label: _("Deny"),
action: () => { action: () => {
this._saveToPermissionStore(DENIED);
this._emitResponse(DialogResponse.DENY); this._emitResponse(DialogResponse.DENY);
}, },
key: Clutter.KEY_Escape }); key: Clutter.KEY_Escape });
this._dialog.addButton({ label: _("Allow"), this._dialog.addButton({ label: _("Allow"),
action: () => { action: () => {
this._saveToPermissionStore(GRANTED);
this._emitResponse(DialogResponse.ALLOW); this._emitResponse(DialogResponse.ALLOW);
}, },
default: true }); default: true });
@ -81,10 +111,43 @@ var InhibitShortcutsDialog = GObject.registerClass({
} }
vfunc_show() { vfunc_show() {
if (this._app && APP_WHITELIST.indexOf(this._app.get_id()) != -1) if (this._app && APP_WHITELIST.indexOf(this._app.get_id()) != -1) {
this._emitResponse(DialogResponse.ALLOW);
return;
}
if (!this._shouldUsePermStore()) {
this._dialog.open();
return;
}
/* Check with the permission store */
let appId = this._app.get_id();
this._permStore = new PermissionStore.PermissionStore((proxy, error) => {
if (error) {
log(error.message);
this._dialog.open();
return;
}
this._permStore.LookupRemote(APP_PERMISSIONS_TABLE,
APP_PERMISSIONS_ID,
(res, error) => {
if (error) {
this._dialog.open();
log(error.message);
return;
}
let [permissions, data] = res;
if (permissions[appId] === undefined) // Not found
this._dialog.open();
else if (permissions[appId] == GRANTED)
this._emitResponse(DialogResponse.ALLOW); this._emitResponse(DialogResponse.ALLOW);
else else
this._dialog.open(); this._emitResponse(DialogResponse.DENY);
});
});
} }
vfunc_hide() { vfunc_hide() {