From 9020fc04594b9b979ca0421d23f4172ba8c8f330 Mon Sep 17 00:00:00 2001 From: "Kenneth Benzie (Benie)" Date: Mon, 8 Apr 2024 23:55:27 +0100 Subject: [PATCH] temp! --- library/gnome_custom_keybindings.py | 154 ++++++++++++++++++++++++++++ roles/gnome-shell/tasks/main.yaml | 32 +++--- 2 files changed, 174 insertions(+), 12 deletions(-) create mode 100644 library/gnome_custom_keybindings.py diff --git a/library/gnome_custom_keybindings.py b/library/gnome_custom_keybindings.py new file mode 100644 index 0000000..d326188 --- /dev/null +++ b/library/gnome_custom_keybindings.py @@ -0,0 +1,154 @@ +#!/usr/bin/python + +# Copyright: (c) 2018, Terry Jones +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) +from __future__ import (absolute_import, division, print_function) +from typing import Dict, List +__metaclass__ = type + +DOCUMENTATION = r''' +--- +module: my_test + +short_description: This is my test module + +# If this is part of a collection, you need to use semantic versioning, +# i.e. the version is of the form "2.5.0" and not "2.4". +version_added: "1.0.0" + +description: This is my longer description explaining my test module. + +options: + name: + description: This is the message to send to the test module. + required: true + type: str + new: + description: + - Control to demo if the result of this module is changed or not. + - Parameter description can be a list as well. + required: false + type: bool +# Specify this value according to your collection +# in format of namespace.collection.doc_fragment_name +# extends_documentation_fragment: +# - my_namespace.my_collection.my_doc_fragment_name + +author: + - Your Name (@yourGitHubHandle) +''' + +EXAMPLES = r''' +# Pass in a message +- name: Test with a message + my_namespace.my_collection.my_test: + name: hello world + +# pass in a message and have changed true +- name: Test with a message and changed output + my_namespace.my_collection.my_test: + name: hello world + new: true + +# fail the module +- name: Test failure of the module + my_namespace.my_collection.my_test: + name: fail me +''' + +RETURN = r''' +# These are examples of possible return values, and in general should use other names for return values. +original_message: + description: The original name param that was passed in. + type: str + returned: always + sample: 'hello world' +message: + description: The output message that the test module generates. + type: str + returned: always + sample: 'goodbye' +''' + +from ansible.module_utils.basic import AnsibleModule, subprocess + + +def run_module(): + # define available arguments/parameters a user can pass to the module + module_args = dict( + keybindings=dict(type='list', require=True), + ) + + # seed the result dict in the object + # we primarily care about changed and state + # changed is if this module effectively modified the target + # state will include any data that you want your module to pass back + # for consumption, for example, in a subsequent task + result = dict( + changed=False, + original_message='', + message='' + ) + + # the AnsibleModule object will be our abstraction working with Ansible + # this includes instantiation, a couple of common attr would be the + # args/params passed to the execution, as well as if the module + # supports check mode + module = AnsibleModule( + argument_spec=module_args, + supports_check_mode=True + ) + + # if the user is working with this module in only check mode we do not + # want to make any changes to the environment, just return the current + # state with no modifications + if module.check_mode: + module.exit_json(**result) + + # manipulate or modify the state as needed (this is going to be the + # part where your module will do what it needs to do) + + keys = [] + for index, keybinding in enumerate(module.params["keybindings"]): + key = f"org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom{index}" + for value in ["binding", "command", "name"]: + subprocess.check_call( + ["dconf", "write", f"/{key}{value}", f"'{keybinding[value]}'"] + ) + keys.append(key) + + subprocess.check_call( + [ + "dconf", + "write", + "/org/gnome/settings-daemon/plugins/media-keys", + f"['{"', '".join(keys)}']", + ] + ) + + # result['original_message'] = str(keybinding_entries) + # result["message"] = str(custom_keybindings) + + # use whatever logic you need to determine whether or not this module + # made any modifications to your target + # if module.params['new']: + result['changed'] = True + + # during the execution of the module, if there is an exception or a + # conditional state that effectively causes a failure, run + # AnsibleModule.fail_json() to pass in the message and the result + # if module.params['name'] == 'fail me': + # module.fail_json(msg='You requested this to fail', **result) + + # in the event of a successful module execution, you will want to + # simple AnsibleModule.exit_json(), passing the key/value results + module.exit_json(**result) + + +def main(): + run_module() + + +if __name__ == '__main__': + main() + diff --git a/roles/gnome-shell/tasks/main.yaml b/roles/gnome-shell/tasks/main.yaml index 419f9a6..cd20279 100644 --- a/roles/gnome-shell/tasks/main.yaml +++ b/roles/gnome-shell/tasks/main.yaml @@ -13,18 +13,26 @@ # NOTE: Use this command to inspect the current state of the custom keybindings # dconf dump / | sed -n '/\[org.gnome.settings-daemon.plugins.media-keys/,/^$/p' +- set_fact: + custom_keybindings: + # TODO: 1Password Quick Access + # [org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0] + # binding='space' + # command='1password --quick-access' + # name='1Password Quick Access' + - binding: space + command: 1password --quick-access + name: 1Password Quick Access + + # TODO: Guake toggle - this requires removing a default binding + # [org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1] + # binding='space' + # command='guake-toggle' + # name='Guake Toggle' + - binding: space + command: guake-toggle + name: Guake Toggle + # TODO: List of custom-keybindings # [org/gnome/settings-daemon/plugins/media-keys] # custom-keybindings=['/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/', '/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/'] - -# TODO: 1Password Quick Access -# [org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0] -# binding='space' -# command='1password --quick-access' -# name='1Password Quick Access' - -# TODO: Guake toggle - this requires removing a default binding -# [org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1] -# binding='space' -# command='guake-toggle' -# name='Guake Toggle'