diff --git a/js/ui/inhibitShortcutsDialog.js b/js/ui/inhibitShortcutsDialog.js index 46e760a98..170cd1a33 100644 --- a/js/ui/inhibitShortcutsDialog.js +++ b/js/ui/inhibitShortcutsDialog.js @@ -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 ModalDialog = imports.ui.modalDialog; +const PermissionStore = imports.misc.permissionStore; const WAYLAND_KEYBINDINGS_SCHEMA = 'org.gnome.mutter.wayland.keybindings'; 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; @@ -43,6 +48,29 @@ var InhibitShortcutsDialog = GObject.registerClass({ 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() { let name = this._app ? this._app.get_name() : this._window.title; @@ -64,12 +92,14 @@ var InhibitShortcutsDialog = GObject.registerClass({ this._dialog.addButton({ label: _("Deny"), action: () => { + this._saveToPermissionStore(DENIED); this._emitResponse(DialogResponse.DENY); }, key: Clutter.KEY_Escape }); this._dialog.addButton({ label: _("Allow"), action: () => { + this._saveToPermissionStore(GRANTED); this._emitResponse(DialogResponse.ALLOW); }, default: true }); @@ -81,10 +111,43 @@ var InhibitShortcutsDialog = GObject.registerClass({ } 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); - else + 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); + else + this._emitResponse(DialogResponse.DENY); + }); + }); } vfunc_hide() {