From 8e0743cbbadf0d0028b0117a24bdcf5504f78422 Mon Sep 17 00:00:00 2001 From: "Kenneth Benzie (Benie)" Date: Sat, 6 Jul 2024 21:02:42 +0100 Subject: [PATCH] Add gsettings module & use it Disable switch-input-source & switch-input-source-backward keybindings. --- library/gsettings.py | 146 ++++++++++++++++++++++++++++++ roles/gnome-shell/tasks/main.yaml | 19 +++- 2 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 library/gsettings.py diff --git a/library/gsettings.py b/library/gsettings.py new file mode 100644 index 0000000..0df376e --- /dev/null +++ b/library/gsettings.py @@ -0,0 +1,146 @@ +# -*- coding: utf-8 -*- + +from typing import Tuple +from ansible.module_utils.basic import AnsibleModule + +DOCUMENTATION = """ +module: gsettings +author: + - Kenneth Benzie (Benie) +short_description: Ansible module for the gsettings configuration tool +options: + schema: + description: + - Schema ID of the settings to configure. + type: str + key: + description: + - Key of an individaul setting to configure. + type: str + value: + description: + - Value to configure the setting with. + - Mutually exclusive with reset. + type: str + reset: + description: + - Flag to reset the setting to the default value. + - Mutually exclusive with value. + type: + default: false +""" + +EXAMPLES = """ +- name: get gnome color-scheme current value + gsettings: + schema: org.gnome.desktop.interface + key: color-scheme + register: color_scheme +- debug: msg={{color_scheme.value}} + +- name: set gnome color-scheme to 'prefer-dark' + gsettings: + schema: org.gnome.desktop.interface + key: color-scheme + value: "'prefer-dark'" + +- name: reset gnome color-scheme to default value + gsettings: + schema: org.gnome.desktop.interface + key: color-scheme + reset: true +""" + +RETURN = """ +value: + description: Value of the setting. + returned: Returned when there is a value. + type: str + sample: "'default'" +stderr: + description: Error output from gsettings. + returned: Returned when there is an error. + type: str + sample: No such key “doesnt-exist” +""" + + +class GSettingsError(Exception): + def __init__(self, command, rc, stderr): + self.command = command + self.rc = (rc,) + self.stderr = stderr + + +def gsettings_get(module: AnsibleModule) -> Tuple[bool, str]: + command = [ + "gsettings", + "get", + module.params["schema"], + module.params["key"], + ] + rc, stdout, stderr = module.run_command(command) + if rc != 0: + raise GSettingsError(command, rc, stderr) + return False, stdout.rstrip() + + +def gsettings_set(module: AnsibleModule) -> Tuple[bool, str]: + command = [ + "gsettings", + "set", + module.params["schema"], + module.params["key"], + module.params["value"], + ] + _, before = gsettings_get(module) + rc, _, stderr = module.run_command(command) + if rc != 0: + raise GSettingsError(command, rc, stderr) + _, after = gsettings_get(module) + return before != after, after + + +def gsettings_reset(module: AnsibleModule) -> Tuple[bool, str]: + command = [ + "gsettings", + "reset", + module.params["schema"], + module.params["key"], + ] + _, before = gsettings_get(module) + rc, stdout, stderr = module.run_command(command) + if rc != 0: + raise GSettingsError(command, rc, stderr) + _, after = gsettings_get(module) + return before != after, after + + +def main() -> None: + module = AnsibleModule( + argument_spec=dict( + schema=dict(type="str"), + key=dict(type="str"), + value=dict(type="str"), + reset=dict(type="bool", default=False), + ), + mutually_exclusive=[["value", "reset"]], + required_together=[["schema", "key"]], + ) + + try: + if module.params["value"]: + changed, value = gsettings_set(module) + elif module.params["reset"]: + changed, value = gsettings_reset(module) + else: + changed, value = gsettings_get(module) + module.exit_json(changed=changed, value=value) + except GSettingsError as error: + module.fail_json( + f"{error.command} failed ({error.rc}): {error.stderr}", stderr=error.stderr + ) + + +if __name__ == "__main__": + main() diff --git a/roles/gnome-shell/tasks/main.yaml b/roles/gnome-shell/tasks/main.yaml index d84a9e0..0194b61 100644 --- a/roles/gnome-shell/tasks/main.yaml +++ b/roles/gnome-shell/tasks/main.yaml @@ -2,7 +2,7 @@ - assert: that: "'GNOME' in ansible_env.XDG_CURRENT_DESKTOP" -- name: install gnome extra packages +- name: install packages become: true package: name: @@ -10,6 +10,23 @@ - gnome-themes-extra state: latest +- name: prefer dark mode + gsettings: + schema: org.gnome.desktop.interface + key: color-scheme + value: "'prefer-dark'" + +- name: disable switch-input-source keybinding + gsettings: + schema: org.gnome.desktop.wm.keybindings + key: switch-input-source + value: '@as []' +- name: disable switch-input-source-backward keybinding + gsettings: + schema: org.gnome.desktop.wm.keybindings + key: switch-input-source-backward + value: '@as []' + # NOTE: Use this command to see default keybindings # gsettings list-recursively | grep -i -E 'media-keys|keybindings' # NOTE: Use this command to inspect the current state of the custom keybindings