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:
parent
9dc99ad611
commit
32b8bc39ac
@ -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);
|
this._emitResponse(DialogResponse.ALLOW);
|
||||||
else
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this._shouldUsePermStore()) {
|
||||||
this._dialog.open();
|
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);
|
||||||
|
else
|
||||||
|
this._emitResponse(DialogResponse.DENY);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_hide() {
|
vfunc_hide() {
|
||||||
|
Loading…
Reference in New Issue
Block a user